我不明白为什么下面的方法不起作用。
我已经尽力了-但没有进展。
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也没有这个问题。完全没有。
答案 0 :(得分:0)
这个问题被可怕地问了,我建议您重写并弄清楚您到底在问什么
同时进行按位运算时,您必须熟悉二进制表示形式,尤其是在这种情况下,负数的二进制补码表示形式
x初始化为b'1110
,并用十进制表示形式14
因此,让我们研究一下第一次迭代b = (b - x) & x
首先,从b=0
和x=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));
话虽如此...问题是什么?