2012-10-24 9 views
6

Ho cercato di capire come funziona se le condizioni funzionano con operatori bit a bit. un modo per verificare se un numero è pari o dispari può essere fatto da:Come funziona l'istruzione condizionale con gli operatori bit-wise?

#include <iostream> 
#include <string> 
using namespace std; 

string test() 
{ 
    int i = 8; //a number 
    if(i & 1) 
     return "odd"; 

    else 
     return "even";  
} 

int main() 
{ 
    cout << test(); 
    return 0; 
} 

La parte che non capisco è come la se la condizione di lavoro. In questo caso se i = 8 allora l'istruzione in If sta facendo 1000 & 1 che dovrebbe restituire 1000 quale uguale 8.

Se i = 7, quindi in if istruzione dovrebbe fare 111 & 1 che restituisce 111 che equivale a 7

Perché è il caso che se (8) si restituisce "pari" e se (7) si restituisce "dispari"? Immagino di voler capire cosa l'istruzione if sta controllando per essere True e cosa sia False quando si tratta di operatori bit-wise.

solo un pensiero quando ho scritto questa domanda è giù perché è in realtà facendo

for 8: 1000 & 0001 which gives 0 
for 7: 0111 & 0001 which gives 1? 
+6

Le tue presunzioni su cosa 'x & y' return sono errate. – chris

+0

"che cosa l'istruzione if sta verificando per essere True e cosa essere False quando si tratta di operatori bit-wise." - il controllo delle condizioni si preoccupa solo del risultato finale, mai di come è calcolato. –

+0

& è bit a bit e. 1000 è 1111101000, mentre 1 è 1. 1111101000 e 1 è 0, quindi è falso. – Cubic

risposta

13

Sì, hai ragione nell'ultima parte. I binari & e | vengono eseguiti bit per bit. Dal momento che

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

possiamo vedere che:

8 & 1 == 1000 & 0001 == 0000 

e

7 & 1 == 0111 & 0001 == 0001 

La funzione test fa correttamente calcolare se un numero è pari o dispari, però, perché a & 1 test se vi sia un 1 nella posizione 1, che esiste solo per numeri dispari.

+1

niente di più da dire qui :) Forse aggiungo che 1 & 0 = 0, 1 & 1 = 1 e 0 & 1 = 0 – count0

2

L'espressione i & 1, dove i è un int, ha tipo int. Il suo valore è 1 o 0, a seconda del valore del bit basso di i. Nella dichiarazione if(i & 1), il risultato di tale espressione viene convertito in bool, seguendo la normale regola per i tipi interi: 0 diventa false e diverso da zero diventa true.

2

Quello che dici che il codice sta facendo è in realtà il modo in cui gli operatori bit-saggio dovrebbero funzionare. Nel suo esempio di (8 & 1):

1000 & 0001 = 0000 

perché nel primo valore, l'ultimo bit è impostato a 0, mentre il secondo valore, l'ultimo bit è impostato a 1. 0 & 1 = 0 .

0111 & 0001 = 0001 

in entrambi i valori, l'ultimo bit è impostato a 1, quindi il risultato è 1 dal 1 & 1 = 1.

2

if(x) in C++ converte x in boolean. Un numero intero è considerato true se è diverso da zero.

Pertanto, tutto ciò che sta facendo if(i & 1) sta verificando se il bit meno significativo è impostato su i.Se è impostato, i&1 sarà diverso da zero; se non è impostato, i&1 sarà zero.

Il bit meno significativo viene impostato in un numero intero se il numero intero è dispari, quindi i&1 è diverso da zero se il numero i è dispari.

+1

Questo è C++ però. 'true' è vero e' false' è falso, solo che interi e puntatori sono ancora implicitamente convertibili in 'bool'. – Cubic

+0

@ Cubic: sì, giusto, in qualche modo mi sono perso. fisso. – nneonneo

4

In realtà, in C, C++ e altri principali linguaggi di programmazione l'operatore & esegue le operazioni AND in ciascun bit per i tipi interi. Il bit n-esimo in un bit AND è uguale a 1 se e solo se il bit n di entrambi gli operandi sono uguali a 1.

Ad esempio:

8 & 1 = 
1000 - 8 
0001 - 1 
---- 
0000 - 0 

7 & 1 = 
0111 - 7 
0001 - 1 
---- 
0001 - 1 

7 & 5 = 
0111 - 7 
0101 - 5 
---- 
0101 - 5 

Per questo motivo facendo un bitwise AND tra un ancora il numero e 1 sarà sempre uguale a 0 perché solo i numeri dispari hanno il loro bit meno significativo uguale a 1.