Cosa significa "valore (int) e 0x1, valore (int) e 0x2, valore (int) e 0x4, valore (int) e 0x8"? "


11

codice

Il "valore" è compreso tra 0 e 15 (i suoi valori possibili). Quando saranno soddisfatte quelle 4 condizioni "se"? Se il mio valore (int) = 2 significa 0010?

            if  ((int)value & 0x1) 
            {
                //statement here
            }
            if  ((int)value & 0x2) 
            {
                //statement here
            }
            if  ((int)value & 0x4) 
            {
                //statement here
            }
            if  ((int)value & 0x8) 
            {
                //statement here
            }

3
Quelle sono maschere di bit che controllano i singoli bit di value(leggi if(value & 0x4)come "È il 3o bit di valueset (= 1)). Poiché apparentemente hai problemi a comprendere il codice, presumo che non sia tuo. Questo (e il fatto che non lo stai chiedendo per la revisione) rende questa domanda off-topic per CR.SE .
Nessuno

Per una migliore comprensione, un codice simile che è stato portato su C # utilizzerà il Enum.HasFlagmetodo per verificare la presenza di bit. Vedi: Enum.HasFlag .
rwong

Risposte:


12

Ogni numero può essere espresso come se value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...ogni b sia uno 0o 1(questi sono i bit della rappresentazione). Questa è la rappresentazione binaria.

Il binario AND ( &) prende ciascuna di quelle bcoppie sagge e performanti su di esse. Questo ha i seguenti risultati:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Usando potenze di 2 (che hanno solo un singolo bit acceso) possiamo isolare e testare i singoli bit:

  • value & 1è vero quando valueè dispari {1, 3, 5, 7, 9, 11, 13, 15}.

  • value & 2è vero quando value/2è dispari {2, 3, 6, 7, 10, 11, 14, 15}.

  • value & 4è vero quando value/4è dispari {4, 5, 6, 7, 12, 13, 14, 15}.

  • value & 8è vero quando value/8è dispari {8, 9, 10, 11, 12, 13, 14, 15}.

Il prefisso 0x sui numeri significa che dovrebbe essere interpretato come un numero esadecimale . È un po 'superfluo quando si sale solo a 0x8 ma dice ai manutentori che è probabilmente usato come maschera di bit.


1
La formulazione può suggerire che può essere estesa a tutti i numeri, il che non è vero: 8/6è dispari, mentre 8&6produce falso.
Sjoerd,

@Sjoerd è per questo che ho detto "poteri di 2"
maniaco del cricchetto

5

Queste istruzioni if ​​verificano se valueè impostato un bit specifico di .

Il valore esadecimale 0x4, ad esempio, ha il 3o bit dalla destra impostato su 1e tutti gli altri bit impostati su 0. Quando si utilizza binary-e operator ( &) con due operanti, il risultato avrà tutti i bit impostati su ad 0eccezione di quei bit che sono 1 in entrambi gli operatori.

Quindi, quando si esegue il calcolo value & 0x4, si ottiene binario 00000000o binario 00000100, a seconda che il terzo bit di valuesia 1o meno 0. Il primo valuta falsee il secondo a true, quindi il blocco if viene eseguito solo per valori in cui è impostato il 3o bit.


1

Ci sono due cose interessanti da notare qui.

Innanzitutto, questo è un modello comune per controllare ciascuno dei 4 bit di ordine inferiore di un valore integrale. La condizione if è soddisfatta se è impostato il bit corrispondente. Per il valore 2, il modello di bit è effettivamente 0010.

L'altra domanda più interessante è perché il (int)cast? A parte il cattivo stile di utilizzo dei cast di C in C ++, nessun cast di valori interi o di caratteri richiede questo cast. Un bool non ha senso, un double / float verrebbe convertito in un numero intero temporaneo e sarebbe insolito usare valori letterali per testare un enum. Potrebbe avere senso con un puntatore, ma sarebbe un uso molto specializzato. Conclusione: il cast non ha senso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.