位操作(遍历所有子集)

时间:2019-03-18 06:28:33

标签: bit-manipulation bit bitmask

我不明白为什么下面的方法不起作用。

我已经尽力了-但没有进展。

int b = 0;
int x = (1<<1)|(1<<2)|(1<<3)
do {
    // process subset
} while((b=(b-x)&x));

我想知道的是表达式b=(b-x)&x  迭代所有子集。

我在Google上搜索了“位操作”或“位子集迭代”,但没有答案或提示。

请帮助我。

即使Stackoverflow也没有这个问题。完全没有。

1 个答案:

答案 0 :(得分:0)

这个问题被可怕地问了,我建议您重写并弄清楚您到底在问什么

同时进行按位运算时,您必须熟悉二进制表示形式,尤其是在这种情况下,负数的二进制补码表示形式

x初始化为b'1110,并用十进制表示形式14 因此,让我们研究一下第一次迭代b = (b - x) & x

首先,从b=0x=14开始,然后从(b-x) = -14或以两个人的称赞...111110010

第二次,使用x进行掩蔽,结果将是(仅考虑4个LSB)0010 & 1110,因此第一次迭代后的结果是:b=b'0010=d'2

您可以尝试通过打印运行此代码以了解迭代过程-通常可以使事情更容易理解:

int counter = 0;
int b = 0;
int x = (1<<1)|(1<<2)|(1<<3);
printf("init x: %x\n", x);
do {
    printf("iteration:%d subset:%x\n",counter++, b);
    printf(" intermediate(b-x): %x\n", (b-x));
} while((b=(b-x)&x));

话虽如此...问题是什么?