2014-02-20 61 views
2

我正在寫一個程序,它將位置3,4和5上的位的值與給定的32位無符號整數的位置24,25和26上的位進行交換。爲什麼「number&(〜(1 << 3))」不適用於0?

因此,可以說我用的是15號,我想將第4位爲0,我會使用...

int number = 15 
int newnumber = number & (~(1 << 3)); 
// output is 7 

這是有道理的,因爲我交換從第4位1到0,所以15(1111)變成7(0111)。

然而,這不會工作其他方式(將0更改爲1),現在我知道如何實現通過不同的方法交換0到1,但我真的想了解此方法中的代碼。

那麼,爲什麼不工作?

+0

僅當兩個輸入都是1時,按位AND的結果爲1,因此0 AND _something_不能成爲1。 – Michael

回答

2

x AND y的真值表爲:

x y Output 
----------- 
0 0 0 
0 1 0 
1 0 0 
1 1 1 

換句話說,輸出/結果只會是1,如果兩個輸入是1,這意味着可以不通過從0位改變爲1按位與。使用按位或爲(例如,int newnumber = number | (1 << 3);

總結:
使用& ~(1 << n)清除位n
使用| (1 << n)來設置位n

1

要設置第四位爲0,您AND它與~(1 << 3)它是1000或的否定。

出於同樣的理由,您可以將其設置爲1 OR ing 1000

要切換它,XOR1000

相關問題