2013-11-15 50 views
2

c更改有點uint32_t的不靈

uint32_t bits = 0; 

bits |= 1<< 31; 
bits |= 1<< 15; 
bits |= 1<< 14; 
bits |= 1<< 13; 

這給了我10000000000000001110000000000000

,並在另一個函數我做*(bits) |= 0 << 15;但它沒有做任何事情,它應該改變16 1一個0,所以下面應該來:10000000000000000110000000000000

有什麼幫助嗎?

+2

'0 << 15'爲'0'。不管你多少次向左或向右移動'0',你總是以'0'結尾。 –

+0

在* *(bits)中取消引用| = 0 << 15;'應該在那裏?第二個'bits'不是'uint32_t'類型嗎?閱讀這個問題和答案,這種不一致似乎有點混亂,儘管與問題無關。 – Nabla

回答

5

將位更改爲0的正確方法是否定and,例如,

bits &= ~(1 << 15); 
1

你要做的:

bits &= ~(1 << 15) 
1

清零位被完成,-ING與補充,即:

*(bits) &= ~(1 << 15); 

(1 << 15)產生了許多與15位設置爲1

00000000000000001000000000000000 

然後按位NOT運算符反相,併產生一個數字,除了15位的所有的人:

11111111111111110111111111111111 

當你和這個號碼原來,在15個位置的位被清除:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
       & 
11111111111111110111111111111111 
================================ 
XXXXXXXXXXXXXXXX0XXXXXXXXXXXXXXX 

其中X標記原始位。