2016-01-17 137 views
8

我試圖找到x的右邊第一位是1,所以我檢查x^1的值是否爲1。然而,C++中if(x^1!= 1)和if(int(x^1)!= 1)有什麼區別?

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

給出錯誤的答案,但

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

給出了正確的答案。

我不知道爲什麼。有人能爲我澄清這件事嗎?

+3

查詢運算符優先級。 –

+3

爲什麼使用'^'(按位排除或)而不是'&'(按位和)?這個測試並不完全符合你的想法。 –

+2

查看那個操作員做了什麼,你想要一個按位而不是XOR! –

回答

13

這是一個陷阱operator precedence。運算符優先級確定操作是如何「分組」的(例如2*3+4導致2*3被「分組」在一起)。添加括號可以改變事物的「分組」方式(例如,2*(3+4)導致3+4「分組在一起」)。

x^1!=1相當於x^(1!=1),可簡化爲x^0

int(x^1)!=1相當於(x^1)!=1(因爲你已經手動添加括號這裏;在int部分不是非常相關的,它是非常重要的括號內)。

正如你所看到的,x^(1!=1)(x^1)!=1是不一樣的。

如果您的目標是檢查第一位,我可能會建議使用按位與(&)。然後你可以做if (x & 1)(但要小心,混合&==會導致與以前相同的問題,所以如果要編寫if ((x & 1) == 1),請使用括號)。

0

簡單地說,!=(不等於關係運算符)的優先級高於^(XOR位運算符)。 Check precedence

int x=6; 

殼體1:if (x^1!=1)

首先,1!=1 is 0;然後6^0= 6。 (110^000 = 110); Check XOR table

情況2:if (int (x^1)!=1)

首先,x^1= 7;然後7!=1 is 1(true)。

+0

感謝@Cornstalks你通知我的權利,我糾正它。 – Kulamani

0

@Cornstalks對他的回答是正確的。

我剛剛想到這(它其實一點兒也不回答你的問題,但可以使其更具可讀性):

另一種方法來解決這個問題只需使用模運算符:

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

最後你的任務只是檢查偶數或奇數值。

相關問題