2016-01-17 21 views
8

Sto cercando di trovare se il primo bit da x da destra è 1, quindi controllo se il valore di x^1 è 1. Tuttavia,Qual è la differenza tra if (x^1! = 1) e if (int (x^1)! = 1) in C++?

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

dà risposta sbagliata, ma

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

dà la risposta corretta.

Non so perché. Qualcuno potrebbe chiarirlo per me?

+3

Avere una ricerca sulla precedenza degli operatori. –

+3

Perché stai usando '^' (esclusivo bit per bit o) invece di '&' (bitwise e)? Questo test non fa esattamente quello che pensi che faccia. –

+2

Cerca cosa fa quell'operatore, vuoi un bit AND NON XOR! –

risposta

13

È una trappola di operator precedence. La precedenza dell'operatore determina il modo in cui le operazioni sono "raggruppate" (come il modo in cui i risultati 2*3+4 vengono "raggruppati" nello 2*3). L'aggiunta di parentesi cambia il modo in cui le cose sono "raggruppate" (ad esempio,fa sì che "3+4" sia raggruppato "insieme).

x^1!=1 è equivalente a x^(1!=1), che può essere semplificato in x^0.

int(x^1)!=1 è equivalente a (x^1)!=1 (perché hai parentesi aggiunto manualmente qui; la parte int non è molto rilevante, è la parentesi che sono importanti).

Come potete vedere, x^(1!=1) e (x^1)!=1 non sono la stessa cosa.

Se il tuo obiettivo è controllare il primo bit, ti suggerisco di usare un bit-AND (&). È quindi possibile fare semplicemente if (x & 1) (ma attenzione, mescolando & e == si verificheranno gli stessi problemi che si erano verificati in precedenza, quindi utilizzare le parentesi se si desidera scrivere if ((x & 1) == 1)).

0

Semplice,! = (Operatore relazionale non uguale) ha una precedenza superiore a^(operatore bitmap XOR). Check precedence

int x=6; 

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

Innanzitutto, 1!=1 is 0; quindi 6^0= 6. (110^000 = 110); Check XOR table

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

In primo luogo, x^1= 7; quindi 7!=1 is 1 (true).

+0

Grazie a @Cornstalks hai comunicato correttamente e l'ho rettificato. – Kulamani

0

@Cornstalks ha ragione con la sua risposta.

Ho appena avuto questo in mente (does'nt infatti rispondere il tuo problema, ma può renderlo più leggibile):

Un altro approccio per risolvere questo problema è semplicemente utilizzando l'operatore modulo:

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

Alla fine il tuo compito è semplicemente un controllo di valori pari o dispari.

Problemi correlati