2011-10-16 73 views
3

我寫了下面幾行:位集的二進制與操作

std::bitset<4> bitvec; //bitset 0000 
std::bitset<4> addition; //bitset 0000 

addition.set(0); //setting the least significant bit 

std::cout << addition << std::endl; //output 0001 
std::cout << std::endl; 

for(int x = 0; x != 16; ++x) { //addition loop 
    std::cout << bitvec << std::endl; //output 
    bitvec &= addition; //binary AND 
} 

std::cout << std::endl; 

和我預期的輸出是:

0000 
0001 
0010 
0011 
0100 
0101 
.... 

但環只是輸出「0000」。我缺少什麼基本概念?

+0

'bitvec'開出零,不管你 「和」 它,你會得到零。你在期待什麼? –

回答

5

邏輯與操作加法。

具體來說,

0000 
& 0001 
------ 
= 0000 

這就解釋了爲什麼你總是0000

邏輯AND僅查看兩個位集中的每個位,並且只有在其他兩個向量中該位爲1時才輸出1。作爲一個例子:

1001 
& 1100 
------ 
= 1000 

之所以說第一位是1是因爲在其他位集的第一比特爲1,其餘爲0,因爲位集的一個在該位置具有0。

如果您想添加,請不要使用bitset,而只需使用添加。

unsigned long a = 0; 

for (int i = 0; i < 16; ++i) 
{ 
    std::cout << std::bitset<4>(a) << std::endl; 
    ++a; 
} 

Output

0000 
0001 
0010 
0011 
0100 
0101 
0110 
0111 
1000 
1001 
1010 
1011 
1100 
1101 
1110 
1111 
+0

好的,謝謝,相當一個誤解我的名義。 – Sim

0

在第一個循環週期 bitvec = 0000 相加= 0001

0000 AND 0001操作將導致爲0000,你分配給0000bitvec重複歷史上的所有下一個循環週期。

您的預期結果是簡單遞增操作或+1添加的結果,基本上只是以二進制格式打印x。你想用位數AND做什麼?