2010-07-17 21 views
19

Digamos que tengo una variable int n = 8. En la mayoría de las máquinas, tendrá un valor de 32 bits. ¿Cómo puedo obtener solo los 8 bits más bajos (byte más bajo) de esto en binario? Además, ¿cómo puedo acceder a cada bit para averiguar qué es? Mi pregunta está relacionada con C¿Cómo obtengo los 8 bits más bajos de int?

Respuesta

30
unsigned n = 8; 
unsigned low8bits = n & 0xFF; 

Nota algunas cosas:

  1. Para operaciones bit a bit, utilice siempre los unsigned tipos
  2. Los bits se pueden extraer de los números utilizando enmascaramiento binaria con la & operador
  3. Para acceder a la baja 8 bits la máscara es 0xFF porque en binario tiene sus 8 bits bajos encendidos y el resto 0
  4. Los 8 bits bajos del número 8 son ... 8 (pensar en ello por un momento)

Para acceder a un determinado bits de un número, dicen que el k ésimo bit:

unsigned n = ...; 
unsigned kthbit = (1 << k) & n; 

Ahora, será kthbit 0 si el k ésimo bit de n es 0, y un número positivo (2**k) si el k ésimo bit de n es 1.

15

Uso aritmética bit a bit para enmascarar los 8 bits más bajos:

unsigned char c = (x & 0xFF); 

Para acceder a la n-ésima bit más bajo, la ecuación es (x & (1 << n)) (n de cero indica el bit menos significativo) . Un resultado de cero indica que el bit es claro, y distinto de cero indica que el bit está configurado.

2

usted no puede est si un bit particular se encuentra en un número utilizando < < y &, es decir:

if (num & (1<<3)) ...

pondrá a prueba si el cuarto bit está establecido o no.

Del mismo modo, puede extraer simplemente los 8 bits más bajos (como un número entero) mediante el uso de & con un número que sólo se ha fijado el 8 bits más bajos, es decir, num & 255 o num & 0xFF (en hexadecimal).

7

La mejor manera es usar el operador lógico de bit & con el valor adecuado.

Así que para los 8 bits inferiores:

n & 0xFF; /* 0xFF == all the lower 8 bits set */ 

O como regla general:

n & ((1<<8)-1) /* generate 0x100 then subtract 1, thus 0xFF */ 

Se puede combinar con el operador de desplazamiento de bits a ser un poco específica:

(n & (1<<3))>>3; 
    /* will give the value of the 3rd bit - note the >>3 is just to make the value either 0, or 1, not 0 or non-0 */ 
+0

¿significa el primer bit '0 ° bit o' 1 ° bit? –

Cuestiones relacionadas