Es ist eine Falle von Vorrang für den Operator . Die Rangfolge der Operatoren bestimmt, wie Operationen "gruppiert" werden (z. B. wie 2*3+4
dazu führt, dass 2*3
zusammen "gruppiert" wird). Das Hinzufügen von Klammern ändert, wie Dinge "gruppiert" werden (z. B. 2*(3+4)
bewirkt, dass 3+4
zusammen gruppiert wird).
x^1!=1
entspricht x^(1!=1)
, was zu x^0
vereinfacht werden kann.
int(x^1)!=1
entspricht (x^1)!=1
(weil Sie hier manuell Klammern hinzugefügt haben; der int
-Teil ist nicht sehr relevant; es sind die Klammern, die wichtig sind).
Wie Sie sehen, sind x^(1!=1)
und (x^1)!=1
nicht identisch.
Wenn es Ihr Ziel ist, das erste Bit zu überprüfen, könnte ich vorschlagen, ein bitweises UND ( &
) zu verwenden. Sie können dann einfach if (x & 1)
ausführen (aber Vorsicht, das Mischen von &
und ==
führt zu denselben Problemen wie zuvor. Verwenden Sie also Klammern, wenn Sie if ((x & 1) == 1)
schreiben möchten).
Einfach,! = (ungleich relationaler Operator) hat eine höhere Priorität als ^ (XOR bitweiser Operator). Überprüfen Sie die Priorität
%Vor% Fall 1: if (x^1!=1)
Erstens, 1!=1 is 0
; dann 6^0= 6
. (%Code%); Überprüfen Sie die XOR-Tabelle
Fall 2: 110 ^ 000 = 110
Erstens, if (int (x^1)!=1)
; dann x^1= 7
(wahr).
@Cornstalks hat Recht mit seiner Antwort.
Ich hatte das nur im Hinterkopf (es beantwortet Ihr Problem zwar nicht, aber es kann lesbarer werden):
Ein anderer Ansatz zur Lösung dieses Problems ist die Verwendung des Modulo-Operators:
%Vor%Am Ende ist Ihre Aufgabe nur eine Überprüfung auf gerade oder ungerade Werte.
Tags und Links c++ bitwise-operators