2011-03-31 52 views
2

我的目標是通過爲每個位分配值來構造一個char變量,即我需要爲每個位分配0和1。操作字符變量的位

我做了下面的代碼:

char packet; 
int bit; 
packet &= ~(1 << 0); 

packet |= (1 << 1); 

printf("\n Checking each bit of packet: \n"); 

for(int x=0;x<2;x++) 
{ 
    bit = packet & (1 << x); 
    printf("\nBit [%d] of packet : %d", x, bit); 
} 

但我得到的輸出是:

Bit[0] of packet : 0 
Bit[1] of packet : 2

這裏有什麼問題嗎?

+1

目前尚不清楚你實際要做什麼。你期望發生什麼? – yan 2011-03-31 04:49:39

+0

這就是你的代碼所做的。設g =垃圾(即未初始化的存儲位)。您從「g g g g g g g g」開始。首先按位運算創建「g g g g g g 0」,第二個運算創建「g g g g g g 0 0」。而你的循環只是輸出[0] = 0x00(第一位是0)。和[1] = 0x02(第二位是1)。所以基本上,正如我們許多人經常說的那樣,「按設計工作」 – DXM 2011-03-31 04:59:43

回答

3

這裏沒有問題,輸出是正確的。

這裏的原因是:當您設置包的價值與|=

,該值是10其中,十進制,是2.當你分配給packet & (1 << x)bit,你實際上將值2( 10二進制)。

Wikipedia entry:

爲了確定第二位是否是 1,按位與施加到其上和 在 含有1中的第二位的另一個比特模式:

0011 (decimal 3) 
AND 0010 (decimal 2) 
    = 0010 (decimal 2) 

如果你的目的是簡單地檢查布爾值是否已經設置,只需將其轉換爲布爾值即可。

(希望所有是有道理的,我有點累了ATM;))

0

該輸出顯示完全預期。位0未置位,位1置位。也許你以後

bit = !!(packet & (1 << x)); 

...如果你想獲得一個01結果。

順便說一下,您應該初始化packet - 使用未初始化的變量會導致未定義的行爲。

+0

或者只是......你知道'bit =小包'x & 1;' – domen 2011-04-02 17:57:37

1

第一件事:

char packet; 
packet &= ~(1 << 0); 

這是不可靠的,因爲packet開始了與什麼是記憶最後(即垃圾)。 1 << 0只是1~1是...... 111110。以packet爲準,每次都會給出不同的答案,這取決於最後的記憶。唯一確定的是最後一位(即最低有效位)將被設置爲0

packet |= (1 << 1); 

這只是將第二位設置爲1。所以現在packetxxxxxx10

你的循環然後遍歷前兩位;每個位被掩碼爲packet & (1 << x),但是只有掩蓋了它,它不會移動它。因此在第一次迭代期間,1 << x1,並且您得到第一位(0)。第二次迭代1 << x10,或者十進制的2。 Anding xxxxxx1010給出10,您立即打印出來(格式爲2)。

如果要移動的位(以將其分離爲0或1),你可以使用:

bit = (packet & (1 << x)) >> x; 

或等值,但更易讀

bit = (packet >> x) & 1; 

這將產生0,1而不是0,2的(我假設期望的)輸出。