2010-07-17 16 views
19

Diciamo che ho una variabile int n = 8. Sulla maggior parte delle macchine questo sarà un valore a 32 bit. Come posso ottenere solo gli 8 bit più bassi (byte più basso) di questo in binario? Inoltre, come posso accedere a ciascun bit per scoprire di cosa si tratta? mia domanda riguarda CCome ottengo gli 8 bit inferiori di int?

risposta

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

Nota alcune cose:

  1. Per operazioni bit per bit, sempre utilizzare i unsigned tipi
  2. bit possono essere estratti da numeri mediante mascheratura binario con il & operatore
  3. Per accedere alla bassa 8 bit la maschera è 0xFF perché in binario ha i suoi 8 bit bassi attivati ​​e il resto 0
  4. Gli 8 bit bassi del numero 8 sono ... 8 (si pensi per un momento)

Per accedere a un po 'certa di un numero, dicono che il k esimo bit:

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

Ora, kthbit sarà 0 se il k esimo bit di n è 0, e qualche numero positivo (2**k) se il k esimo bit di n è 1.

15

Usa aritmetica bit per mascherare i bassi 8 bit:

unsigned char c = (x & 0xFF); 

Per accedere al bit più basso esimo, l'equazione è (x & (1 << n)) (n pari a zero indica il bit meno significativo) . Un risultato pari a zero indica che il bit è chiaro e non zero indica che il bit è impostato.

2

si può t est se un particolare bit è impostato in un numero utilizzando < < e &, cioè:

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

sarà verificare se il quarto bit è impostata oppure no.

Allo stesso modo, è possibile estrarre semplicemente le basse 8 bit (come un intero) utilizzando & con un numero che ha solo i bassi 8 bit impostati, cioè num & 255 o num & 0xFF (in esadecimale).

7

Il modo migliore è utilizzare l'operatore logico di bit & con il valore corretto.

Così, per gli 8 bit inferiori:

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

O come regola generale:

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

È possibile combinare con l'operatore punta passaggio per ottenere un po 'particolare:

(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

il primo bit significa '0 °' bit o '1 °' bit? –

Problemi correlati