Was ist der Unterschied zwischen if (x ^ 1! = 1) und if (int (x ^ 1)! = 1) in C ++?

8

Ich versuche herauszufinden, ob x 's erstes Bit von rechts 1 ist, also überprüfe ich, ob der Wert von x^1 1 ist. Jedoch,

%Vor%

gibt falsche Antwort, aber

%Vor%

gibt die richtige Antwort.

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

    
Luke 17.01.2016, 21:37
quelle

3 Antworten

13

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

    
Cornstalks 17.01.2016 21:42
quelle
0

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

    
Kulamani 18.01.2016 15:57
quelle
0

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

    
shock_gone_wild 11.02.2016 14:57
quelle

Tags und Links