位集合二进制与运算

4

我写了以下代码:

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'。我缺失了什么基本概念?

bitvec 开始时为零,无论你与它进行“与”操作,你都会得到零。你期望得到什么? - CB Bailey
2个回答

6

逻辑与(Logical AND)不是加法。

具体来说,

  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

0

在第一个循环周期中, bitvec = 0000 addition = 0001

0000 AND 0001 操作的结果将为 0000,您将把 0000 分配给 bitvec,并在所有下一个循环周期中重复历史。

您期望的结果是简单的增量操作或 +1 加法,基本上只需以二进制格式打印 x。您想使用按位 AND 做什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接