Cosa significa "(int) value & 0x1, (int) value & 0x2, (int) value & 0x4, (int) value & 0x8 significa"

5

code

Il "valore" va da 0 a 15 (è possibile valori). Quando saranno soddisfatte queste 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
            }
    
posta gnat 02.07.2014 - 10:31
fonte

3 risposte

9

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

Il valore binario AND ( & ) prende ciascuno di quei b pair wise e sta eseguendo AND su di essi. Questo ha i seguenti output:

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

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

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

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

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

  • value & 8 è true 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 arriva solo a 0x8 ma si dice ai maintainer che probabilmente è usato come maschera di bit.

    
risposta data 02.07.2014 - 12:51
fonte
3

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

Il valore esadecimale 0x4 , ad esempio, ha il 3 ° bit da destra impostato a 1 e tutti gli altri bit impostati su 0 . Quando si utilizza l'operatore binario e ( & ) con due operanti, il risultato avrà tutti i bit impostati su 0 tranne per quei bit che sono 1 in entrambi gli operanti.

Quindi, quando esegui il calcolo value & 0x4 , ottieni il% binario% co_de o il% binario% co_de, a seconda che il terzo bit di 00000000 sia 00000100 o value . Il primo valuta a 1 , il secondo a 0 , quindi il blocco if viene eseguito solo per i valori in cui è impostato il terzo bit.

    
risposta data 02.07.2014 - 15:13
fonte
0

Ci sono due cose interessanti da notare qui.

In primo luogo, questo è uno schema comune per il controllo di ciascuno dei 4 bit di ordine basso di un valore integrale. La condizione if viene soddisfatta se il bit corrispondente è impostato. Per il valore 2 il pattern di bit è effettivamente 0010.

L'altra domanda più interessante è perché il cast di (int) ? A parte il pessimo stile dell'uso di C-cast in C ++, nessun valore intero o di carattere richiede questo cast. Un bool non ha senso, un double / float verrebbe convertito in un intero temporaneo e sarebbe inusuale 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.

    
risposta data 02.07.2014 - 16:18
fonte

Leggi altre domande sui tag