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