2011-10-16 2 views
3

Я написал следующие строки:bitsets бинарная операция И

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.

Логический И просто смотрит на каждый бит в обоих битах и ​​выводит только 1, если этот бит равен 1 в обоих других векторах. В качестве примера:

1001 
& 1100 
------ 
= 1000 

Причина, по которой первый бит равен 1, так как первый бит в других bitsets равно 1. Остальные 0, потому что один из bitsets имеет 0 в этой позиции.

Если вы хотите добавить, не используйте битрейт и просто используйте дополнение.

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 и назначении 0000 на bitvec и история повторяется на всех последующих циклов цикла.

Ваши ожидаемые результаты являются результатом простой операции увеличения или добавления +1, в основном, только prin x в двоичном формате. Что вы пытаетесь сделать с поразрядным AND?