Es ist eine Falle von operator precedence. Die Vorrangigkeit des Operators bestimmt, wie die 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)
, die vereinfacht werden kann zu x^0
.
int(x^1)!=1
entspricht (x^1)!=1
(weil Sie hier Klammern manuell hinzugefügt haben; der int
Teil ist nicht sehr relevant; es sind die Klammern, die wichtig sind).
Wie Sie sehen können, sind x^(1!=1)
und (x^1)!=1
nicht identisch.
Wenn Ihr Ziel ist, das erste Bit zu überprüfen, kann ich vorschlagen, ein bitweises UND (&
) zu verwenden. Sie können dann einfach if (x & 1)
(aber Vorsicht, Mischen &
und ==
wird zu den gleichen Problemen führen, die Sie zuvor hatten, also verwenden Sie Klammern, wenn Sie if ((x & 1) == 1)
schreiben möchten).
Suchen Sie nach Operatoren Vorrang. –
Warum verwenden Sie '^' (bitweise exklusiv oder) anstelle von '&' (bitweise und)? Dieser Test tut nicht ganz das, was er zu tun glaubt. –
Schauen Sie, was dieser Operator tut, Sie wollen ein bitweises UND nicht XOR! –