2013-04-10 40 views
4

所以我有一個16位數字。假定它的變量名稱是Bits。我想讓比特[2:0] = 001,100和000,而不改變別的。我不知道該怎麼做,因爲我能想到的只是ORing我想成爲1和1的位,但我不知道如何清除其他位,使它們爲0.如果有人有建議,我會很感激。謝謝!在C中更改int中的位?

+0

[Shift運營商](http://en.wikipedia.org/wiki/Bitwise_operation#Shifts_in_C.2C_C.2B.2B.2C_C.23) – Anthony 2013-04-10 01:02:27

+0

首先,它不會被稱爲「位」,它會被稱爲「位」。 – 2013-04-10 01:02:56

+0

http://en.wikipedia.org/wiki/Bitwise_operations_in_C – 2013-04-10 01:03:17

回答

5

要清除某些位,&與要清零的位相反。然後你可以在你想要的位上輸入|

在這種情況下,你要零出低三位(111二進制或十進制7),所以我們&~7才能徹底清除這些位。

Bits = (Bits & ~7) | 1; // set lower three bits of Bits to 001 
+0

它可能有助於解釋'〜7'是什麼情況,以防被詢問者不知道按位運算符。 – 2013-04-10 01:07:48

+0

@ Gabriel:完成。 – nneonneo 2013-04-10 01:09:40

+0

哦!我不知道你可以這樣做......謝謝! – user2253332 2013-04-10 01:17:38

1

union結構允許指定一個具有可變的比特數和單獨地尋址一個更大的變量的每一個比特的能力。

union { 
    short value; 
    struct { 
     unsigned char bit0 : 1; 
     unsigned char bit1 : 1; 
     unsigned char bit2 : 1; 
     unsigned char bit3 : 1; 
     unsigned char bit4 : 1; 
     unsigned char bit5 : 1; 
     unsigned char bit6 : 1; 
     unsigned char bit7 : 1; 
     unsigned char bit8 : 1; 
     unsigned char bit9 : 1; 
     unsigned char bit10 : 1; 
     unsigned char bit11 : 1; 
     unsigned char bit12 : 1; 
     unsigned char bit13 : 1; 
     unsigned char bit14 : 1; 
     unsigned char bit15 : 1; 
    } bits; 
} var; 

現在你有一個名爲var持有的16位整數,它可以通過var.value引用變量,你必須通過var.bits.bit15 acessing var.bits.bit0訪問該變量的每個單獨的位。

通過設置var.value = 0;所有位也被設置爲0。通過設置var.bits.bit0 = 1;,您可以自動將var.value的值更改爲0x8000,或者如二進制1000000000000000所示。

如果你的目的是改變只有最後3位,可以簡化結構,以更多的東西是這樣的:

union { 
    short value; 
    struct { 
     unsigned short header : 13; 
     unsigned char bit13 : 1; 
     unsigned char bit14 : 1; 
     unsigned char bit15 : 1; 
    } bits; 
} var; 

現在你有var.bits.header,這是一個13位的變量,而其他3 1位變量,你可以玩。

但是請注意C++不支持這種結構,所以爲了獲得最佳的C到C++可移植性,您可能更願意使用bitwise operations,而不是像@nneonneo所建議的那樣。