2012-10-24 13 views
6

Próbowałem zrozumieć, jak jeśli warunek działa z operatorami bitowymi. sposób sprawdzić, czy liczba jest parzysta lub nieparzysta może być wykonana przez:W jaki sposób instrukcja warunku działa z operacjami bitowymi?

#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; 
} 

Part I nie rozumiem, jak gdyby praca warunek. W tym przypadku, jeśli i = 8, to w instrukcji If to robi 1000 & 1, co powinno dać z powrotem 1000, które jest równe 8.

Jeśli i = 7, to w instrukcji if powinno być robione 111 & 1, które oddaje 111, które są równe 7

Dlaczego tak się dzieje, że jeśli (8) zwróci wartość "parzystą", a jeśli (7) zwróci wartość "nieparzystą"? Chyba chcę zrozumieć, co oświadczenie if sprawdza, czy jest prawdziwe, a co fałszywe, gdy ma do czynienia z operacjami bitowymi.

tylko myśl, kiedy pisałem to pytanie w dół jest to, bo to rzeczywiście robi

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

Twoje domniemania dotyczące zwrotu "x i y" są błędne. – chris

+0

"co stwierdzenie, jeśli sprawdza, czy jest prawdziwe, a co fałszywe, gdy mamy do czynienia z operacjami bitowymi". - sprawdzanie stanu tylko dba o wynik końcowy, nigdy o jego obliczenie. –

+0

& jest bitowe i. 1000 to 1111101000, a 1 to 1. 1111101000 i 1 to 0, więc jest to fałsz. – Cubic

Odpowiedz

13

Tak, masz rację, w ostatniej części. Binary & i | są wykonywane bit po bicie. Od

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

widzimy, że:

8 & 1 == 1000 & 0001 == 0000 

i

7 & 1 == 0111 & 0001 == 0001 

Twoja funkcja test ma prawidłowo obliczyć, czy dana liczba jest parzysta lub nieparzysta chociaż, ponieważ a & 1 testy czy istnieje 1 w miejscu 1-szym, które zawiera tylko liczby nieparzyste.

+1

nic więcej do powiedzenia tutaj :) Może dodać, że 1 i 0 = 0, 1 i 1 = 1 i 0 i 1 = 0 – count0

2

Wyrażenie i & 1, gdzie i jest int, ma typ int. Jego wartość to 1 lub 0, w zależności od wartości niskiego bitu i. W oświadczeniu if(i & 1) wynik tego wyrażenia jest konwertowany na bool, zgodnie z typową regułą dla typów całkowitych: 0 staje się false, a niezerowy staje się true.

2

To, co mówisz, że kod jest wykonywany, to w rzeczywistości działanie operatorów bitowych. W swoim przykładzie (8 & 1):

1000 & 0001 = 0000 

ponieważ w pierwszej wartości, ostatni bit jest ustawiony na 0, natomiast w drugiej wartości, ostatni bit jest ustawiony na 1. 0 & 1 = 0 .

0111 & 0001 = 0001 

w obu wartości, ostatni bit jest ustawiony na 1, a więc jest jeden od 1 & 1 = 1.

2

if(x) C++ przekształca x się logiczne. Liczbę całkowitą uważa się za true. Iff jest niezerowe.

Tak więc, wszystkie czynności wykonywane przez if(i & 1) polegają na sprawdzeniu, czy najmniej znaczący bit jest ustawiony na i.Jeśli zostanie ustawiony, i&1 będzie niezerowe; jeśli nie zostanie ustawiony, i&1 będzie zero.

Najmniej znaczący bit jest ustawiany w liczbę całkowitą, w której liczba całkowita jest nieparzysta, więc w ten sposób i&1 jest niezerowa iff i jest nieparzysta.

+1

To jest jednak C++. "prawda" to prawda, a "fałsz" to fałsz, tyle tylko, że liczby całkowite i wskaźniki są nadal niejawnie wymienialne na 'bool'. – Cubic

+0

@Cubic: tak, prawda, jakoś tęskniłem za tym. naprawiony. – nneonneo

4

W rzeczywistości, w językach C, C++ i innych głównych językach programowania operator & wykonuje operacje w każdym bicie dla typów integralnych. N-ty bit w bitowego AND jest równy 1 wtedy i tylko wtedy, gdy n-ty bit obu operandów są równe 1.

Na przykład:

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

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

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

Z tego powodu robi bitowego AND między parzysta numer i 1 zawsze będą równe 0, ponieważ tylko liczby nieparzyste mają najmniej znaczący bit równy 1.

Powiązane problemy