martes, 5 de febrero de 2008

Operadores Lógicos Binarios – Segunda Parte

Presentamos ahora algunas aplicaciones utilizando los operadores lógicos binarios, implementando una biblioteca de funciones de utilidad general, y un pequeño programa demostrativo de dichas funciones, las cuales pasamos a describir brevemente, aclarando que los números manejados son del tipo unsigned char, es decir, números enteros positivos de un byte.

printbits: Recibe un número en decimal y lo escribe en binario. Utiliza la función condicional implícita.

onoff: Recibe un número en decimal y la posición de un bit, y determina si ese bit está encendido (1) o apagado (0).

put_on: Recibe un número en decimal y la posición de un bit y lo enciende, es decir, lo convierte en 1.

put_off: Recibe un número en decimal y la posición de un bit y lo apaga, es decir, lo convierte en 0.

right_rot : Recibe un número en decimal (x) y un número entre 0 y 7 (n), y rota n posiciones a la derecha los bits de x.

left_rot : Recibe un número en decimal (x) y un número entre 0 y 7 (n), y rota n posiciones a la izquierda los bits de x.

change_nibbles: Recibe un número en decimal e Intercambia sus nibbles.

right_nibble: Recibe un número en decimal y devuelve su nibble derecho

left_nibble: Recibe un número en decimal y devuelve su nibble izquierdo


// Biblioteca de funciones de manipulacion de bits
// bits.h

#include <stdio.h>

// Escribe un numero en binario
void printbits(unsigned char x) {
for (int i = 7; i >= 0; i--)
   printf("%c", (x & (1 << i)) ? '1' : '0');
}

// Determina si el bit n de un byte esta encendido (1) o apagado (0)
unsigned char onoff(unsigned char x, unsigned char n) {
     if (x & (1 << n)) return 1;
     else return 0;
}

// Enciende un bit
unsigned char put_on(unsigned char x, unsigned char n) {
     return x |(1 << n);
}

// Apaga un bit
unsigned char put_off(unsigned char x, unsigned char n) {
     return x & (255 - (1 << n));
}

// Realiza la rotacion a la derecha
unsigned char right_rot(unsigned char x, unsigned char n) {
     return (x >> n) | (x << (8 - n));
}

// Realiza la rotacion a la izquierda
unsigned char left_rot(unsigned char x, unsigned char n) {
    return (x << n) | (x >> (8 - n));
}

// Intercambia los nibbles (4 bits) de un byte
unsigned char change_nibbles(unsigned char x) {
     return (x << 4) | (x >> 4);
}

// Obtiene el nibble izquierdo
unsigned char left_nibble(unsigned char x) {
     return x >> 4;
}

// Obtiene el nibble derecho
unsigned char right_nibble(unsigned char x) {
     return x & 15;
}

Listado 1. bits.h


Y ahora el programa ejemplo para demostrar el uso de las funciones de la biblioteca.

// Manejo de bits
// bits.cpp

#include <stdio.h>
#include <conio.h>
#include <C:\BC5\Programas\bits.h>  // Ubicar la ruta del archive de biblioteca

unsigned char m1, m2, n1, n2, x, y, z;

void NuevaLinea();

void main() {
    m1 = m2 = 59;
    n1 = n2 = 172;

    printf("Valores originales.\n");
    printf(" 76543210\n");
    printf("m1 = %3d = ", m1); printbits(m1); NuevaLinea();
    printf("n1 = %3d = ", n1); printbits(n1); NuevaLinea();

    printf("El bit 4 de m1 vale %d\n", onoff(m1, 5) ? 1 : 0);
    printf("El bit 4 de n1 vale %d\n", onoff(n1, 4) ? 1 : 0);
    NuevaLinea();

    printf("Se enciende el bit 6 de %3d. Resultado en x.\n", m2);
    x = put_on(m2, 6);
    printf(" 76543210\n");
    printf(" x = %3d = ", x); printbits(x); NuevaLinea();
    printf("El bit 6 de x vale %d\n", onoff(x, 4) ? 1 : 0);
    NuevaLinea();

    printf("Se apaga el bit 5 de %3d. Resultado en y.\n", n2);
    y = put_off(n2, 5);
    printf(" 76543210\n");
    printf(" y = %3d = ", y); printbits(y); NuevaLinea();
    printf("El bit 5 de y vale %d\n", onoff(y, 5));
    NuevaLinea();

    m2 = m1; n2 = n1;
    printf("%3d se rota 3 bits a la derecha. Resultado en x.\n", m2);
    x = right_rot(m2, 3);
    printf(" 76543210\n");
    printf("m2 = %3d = ", m2); printbits(m2); NuevaLinea();
    printf(" x = %3d = ", x); printbits(x); NuevaLinea();
    NuevaLinea();

    printf("%3d se rota 3 bits a la izquierda. Resultado en y.\n", n2);
    y = left_rot(n2, 3);
    printf(" 76543210\n");
    printf("n2 = %3d = ", n2); printbits(n2); NuevaLinea();
    printf(" y = %3d = ", y); printbits(y); NuevaLinea();
    NuevaLinea();

    m2 = m1; n2 = n1;
    printf("Se intercambian los nibbles de %3d. Resultado en x.\n", m2);
    x = change_nibbles(m2);
    printf(" 76543210\n");
    printf("m2 = %3d = ", m2); printbits(m2); NuevaLinea();
    printf(" x = %3d = ", x); printbits(x); NuevaLinea();
    NuevaLinea();

    printf("Se intercambian los nibbles de %3d. Resultado en y.\n", n2);
    y = change_nibbles(n2);
    printf(" 76543210\n");
    printf("n2 = %3d = ", n2); printbits(n2); NuevaLinea();
    printf(" y = %3d = ", y); printbits(y); NuevaLinea();
    NuevaLinea();

    m2 = m1; n2 = n1;
    printf("Se obtiene el nibble izquierdo de %3d. Resultado en x.\n", m2);
    x = left_nibble(m2);
    printf(" 76543210\n");
    printf("m2 = %3d = ", m2); printbits(m2); NuevaLinea();
    printf(" x = %3d = ", x); printbits(x); NuevaLinea();
    NuevaLinea();

    printf("Se obtiene el nibble derecho de %3d. Resultado en y.\n", n2);
    y = right_nibble(n2);
    printf(" 76543210\n");
    printf("n2 = %3d = ", n2); printbits(n2); NuevaLinea();
    printf(" y = %3d = ", y); printbits(y); NuevaLinea();
    NuevaLinea();

getch();

}

void NuevaLinea() {
    printf("\n");
}

Listado 2. bits.cpp

No hay comentarios:

Publicar un comentario