Hace unos días empecé con la serie Bailando con Bits (aunque llevaba escrito varios meses) trata de formas para trabajar a nivel de bit desde C.
Hoy voy a proponer otra forma, quizás menos intuitiva que la anterior, pero diferente. Esta vez no utilizaremos un registro enorme ni nada parecido, utilizaremos un mismo número entero para hacer el ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <stdio.h> #define PESOBIT(bpos) 1<<bpos #define COGEBIT(var,bpos) (var & PESOBIT(bpos))?1:0 #define PONE_1(var,bpos) var | PESOBIT(bpos) #define PONE_0(var,bpos) var & ~(PESOBIT(bpos)) #define CAMBIA(var,bpos) var ^ PESOBIT(bpos) int main() { int numero; int i; numero=63; printf ("Numero: %d\n", numero); for (i=31; i>=0; i--) printf("%4d", i); printf("\n"); for (i=31; i>=0; i--) printf("%4d",COGEBIT(numero,i)); printf("\n"); numero=PONE_1(numero, 17); numero=PONE_0(numero, 3); numero=CAMBIA(numero, 20); numero=CAMBIA(numero, 5); for (i=31; i>=0; i--) printf("%4d",COGEBIT(numero,i)); printf("\nNúmero: %d\n", numero); } |
Ahora usamos varias macros que harán operaciones de bit con la variable a analizar (están definidas en la parte de arriba), tenemos PESOBIT, COGEBIT, PONE_1, PONE_0 y CAMBIA:
- PESOBIT: Nos dice cuánto vale un bit con valor 1 en la posición especificada, por ejemplo en la posición 0 (LSB) vale 1, en la posición 1, vale 2, en la posición 3, vale 4, en la posición 4, vale 8…
- COGEBIT: Nos dice si el bit en la posición bpos de la variable var vale 0 ó 1
- PONE_1: Pone un 1 en el bit bpos de la variable var
- PONE_0: Pone un 0 en el bit bpos de la variable var
- CAMBIA: Cambia el valor (de 0 a 1 y viceversa) del bit en la posición bpos de la variable var
Como vemos en el ejemplo si queremos poner a 1 el bit 5 de numero, tendremos que hacer numero=PONE_1(numero,5), aunque en el siguiente ejemplo veremos cómo simplificar todo eso.… Leer artículo completo
Últimos comentarios