2016-01-17 18 views
8

Ich versuche zu finden, wenn x ist das erste Bit von rechts ist 1, so überprüfe ich, ob der Wert x^11 ist. AllerdingsWas ist der Unterschied zwischen if (x^1! = 1) und if (int (x^1)! = 1) in C++?

int x=6; 
if (x^1!=1) 

gibt falsche Antwort, aber

if (int(x^1)!=1) 

gibt die richtige Antwort.

Ich bin mir nicht sicher warum. Könnte jemand das für mich klären?

+3

Suchen Sie nach Operatoren Vorrang. –

+3

Warum verwenden Sie '^' (bitweise exklusiv oder) anstelle von '&' (bitweise und)? Dieser Test tut nicht ganz das, was er zu tun glaubt. –

+2

Schauen Sie, was dieser Operator tut, Sie wollen ein bitweises UND nicht XOR! –

Antwort

13

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).

0

Einfach,! = (Ungleich relationaler Operator) hat eine höhere Priorität als^(XOR bitweiser Operator). Check precedence

int x=6; 

Fall 1:if (x^1!=1)

Zuerst 1!=1 is 0; dann 6^0= 6. (110^000 = 110); Check XOR table

Fall 2:if (int (x^1)!=1)

Zuerst x^1= 7; dann 7!=1 is 1 (wahr).

+0

Dank @Cornstalks Sie benachrichtigt Recht und ich habe es behoben. – Kulamani

0

@Cornstalks ist richtig mit seiner Antwort.

Ich hatte gerade, dass im Sinn (es in der Tat does'nt Ihr Problem beantworten, aber kann es besser lesbar machen):

Ein anderer Ansatz zur Lösung dieses Problems ist einfach mit dem Modulo-Operator:

if(x%2 == 0) // then first bit is 0 
else // first bit is 1 

Am Ende ist Ihre Aufgabe einfach eine Überprüfung auf gerade oder ungerade Werte.

Verwandte Themen