2012-10-24 5 views
6

Ich versuchte zu verstehen, wie wenn Bedingung mit bitweisen Operatoren arbeiten. Eine Möglichkeit, zu überprüfen, ob eine Zahl durch kann gerade oder ungerade getan werden muss:Wie funktioniert die Bedingungserklärung mit bitweisen Operatoren?

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

Der Teil, wenn die Bedingung ist, wie die Arbeit, die ich nicht verstehe. In diesem Fall, wenn i = 8, dann macht die in If-Anweisung 1000 & 1, die 1000 zurückgeben soll, was gleich 8 ist.

Wenn i = 7, dann in if-Anweisung sollte es 111 & 1 tun, was 111 zurückgibt, die gleich 7 sind

Warum ist es so, dass wenn (8) "even" zurückgibt und wenn (7) "odd" zurückgibt? Ich denke, ich möchte verstehen, was die if-Anweisung prüft, um wahr zu sein und was falsch ist, wenn es um bitweise Operatoren geht.

nur so ein Gedanke, wenn ich diese Frage nach unten ist es geschrieben, weil es tatsächlich ist ja

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

Ihre Vermutungen darüber, was "x & y" zurückgibt, sind falsch. – chris

+0

"was die if-Anweisung prüft, um wahr zu sein und was falsch ist, wenn es um bitweise Operatoren geht." - Die Überprüfung der Bedingungen kümmert sich nur um das Endergebnis, niemals darum, wie es berechnet wird. –

+0

& ist bitweise und. 1000 ist 1111101000, während 1 1 ist. 1111101000 & 1 ist 0, also ist es falsch. – Cubic

Antwort

13

tun, dass Sie sich im letzten Teil sind. Binär & und | werden Stück für Stück durchgeführt. Da

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

können wir sehen, dass:

8 & 1 == 1000 & 0001 == 0000 

und

7 & 1 == 0111 & 0001 == 0001 

Ihre test Funktion richtig funktioniert berechnen, ob eine Zahl, obwohl gerade oder ungerade ist, weil a & 1 prüft, ob es liegt 1 in der 1s Stelle, die es nur für ungerade Nummern gibt.

+1

nichts mehr zu sagen :) Vielleicht hinzufügen, dass 1 & 0 = 0, 1 & 1 = 1 und 0 & 1 = 0 – count0

2

Der Ausdruck i & 1, wobei eine iint, hat int eingeben. Ihr Wert ist 1 oder 0, abhängig vom Wert des niedrigen Bits von i. In der Anweisung if(i & 1) wird das Ergebnis dieses Ausdrucks in bool konvertiert, wobei die übliche Regel für ganzzahlige Typen verwendet wird: 0 wird false, und ungleich 0 wird true.

2

Was Sie sagen, der Code tut, ist tatsächlich, wie Bit-weise Operatoren funktionieren sollen. In Ihrem Beispiel von (8 & 1):

1000 & 0001 = 0000 

weil in dem ersten Wert, das letzte Bit auf 0 gesetzt ist, während in dem zweiten Wert ist, der letzte Bit auf 1 0 & 1 = 0 gesetzt .

0111 & 0001 = 0001 

in beiden Werten wird das letzte Bit auf 1 gesetzt, so boolean das Ergebnis 1 da 1 & 1 = 1.

2

if(x) in C++ konvertiert zu x. Eine Ganzzahl wird als true betrachtet, wenn sie ungleich Null ist.

Daher überprüft alle if(i & 1), ob das niedrigstwertige Bit in i gesetzt ist.Wenn es gesetzt ist, wird i&1 ungleich Null sein; Wenn es nicht eingestellt ist, wird i&1 Null sein.

Das niedrigstwertige Bit wird in eine Ganzzahl gesetzt, wenn diese ganze Zahl ungerade ist, daher ist i&1 ungleich Null, wenn i ungerade ist.

+1

Dies ist C++ obwohl. 'true' ist wahr und' false' ist falsch, nur dass ganze Zahlen und Zeiger implizit in 'bool' umgewandelt werden können. – Cubic

+0

@Cubic: Ja, richtig, das habe ich irgendwie vermisst. Fest. – nneonneo

4

Tatsächlich, in C, C++ und anderen wichtigen Programmiersprachen & Operator tun AND Operationen in jedem Bit für integrierte Typen. Die n-te Bit in einem bitweise ist AND gleich 1, wenn und nur wenn das n-te Bit der beiden Operanden gleich sind 1.

Zum Beispiel:

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

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

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

Aus diesem Grund eine bitweise AND zwischen einem selbst zu tun Nummer und 1 sind immer gleich 0, da nur ungerade Zahlen ihr niedrigstwertiges Bit 1 haben.

Verwandte Themen