2012-02-19 77 views
-4

我玩弄試圖得到它的正確理解位,我碰到這個問題來了。我將char中的第六位設置爲1,我試圖找出它是否被設置爲1.它給我一個錯誤的答案。位操作

int main(int argc, char** argv) { 
    unsigned char a=0; 
    a=a | (1<<6); 
    int b=a &(1<<6); 
    cout<< b; 
    return 0; 
} 

它給我的結果是64而不是1.爲什麼?

+5

爲什麼它應該給你1?在你的腦海裏,你覺得'&'做什麼? – 2012-02-19 23:33:08

+0

你做錯了。 2^6 = 64 – UmNyobe 2012-02-19 23:34:58

+0

謝謝看到我的錯誤 – 2012-02-19 23:46:24

回答

1

這確實是正確的和預期的行爲。

檢查位n是否被設置的方法是這樣的:

return (value & (1U << n)) == (1U << n); 

&執行按位 AND,所以11111111 & 0100000001000000

0

您可以使用:

int b = (a >> 6) & 1; 

b== 1如果第六位設置和0如果事實並非如此。

0

程序的預期輸出是64,因爲64&64是64.由於非零值被解釋爲真在if表達式和條件運算符(&&||),這對很多情況下不夠好:

a |= (1<<6); 
if (a & (1<<6)) 
{ 
    /* this code would get executed */ 
} 

如果你通過在你的變量64S困擾,然後再嘗試這樣的事:

bool b = (a & (1<<6)) ? true : false; 

我如果在這裏需要三元運算符不知道,但就是非常清楚發生了什麼事情。

或者你很可能做到這一點:

bool b = a >> 6 & 1;