我試圖找到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)
給出了正確的答案。
我不知道爲什麼。有人能爲我澄清這件事嗎?
我試圖找到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)
給出了正確的答案。
我不知道爲什麼。有人能爲我澄清這件事嗎?
這是一個陷阱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)
,請使用括號)。
簡單地說,!=(不等於關係運算符)的優先級高於^(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)。
感謝@Cornstalks你通知我的權利,我糾正它。 – Kulamani
@Cornstalks對他的回答是正確的。
我剛剛想到這(它其實一點兒也不回答你的問題,但可以使其更具可讀性):
另一種方法來解決這個問題只需使用模運算符:
if(x%2 == 0) // then first bit is 0
else // first bit is 1
最後你的任務只是檢查偶數或奇數值。
查詢運算符優先級。 –
爲什麼使用'^'(按位排除或)而不是'&'(按位和)?這個測試並不完全符合你的想法。 –
查看那個操作員做了什麼,你想要一個按位而不是XOR! –