Логическое И это не сложение.
В частности,
0000
& 0001
------
= 0000
Что объясняет, почему вы всегда получаете 0000
.
Логическое И просто просматривает каждый бит в обоих наборах битов и выдает только 1, если этот бит равен 1 в обоих других векторах. Как пример:
1001
& 1100
------
= 1000
Причина, по которой первый бит равен 1, заключается в том, что первый бит в других наборах битов равен 1. Остальные равны 0, поскольку один из наборов битов имеет 0 в этой позиции.
Если вы хотите сложение, не используйте битовый набор, просто используйте сложение.
unsigned long a = 0;
for (int i = 0; i < 16; ++i)
{
std::cout << std::bitset<4>(a) << std::endl;
++a;
}
выход
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111