我不明白为什么下面不起作用。
我已经尝试了我能做的一切 - 但没有进展。
int b = 0;
int x = (1<<1)|(1<<2)|(1<<3)
do {
// process subset
} while((b=(b-x)&x));
我想知道的是表达式b=(b-x)&x
迭代所有子集。
我搜索谷歌像'位操纵'或'位子集迭代',但没有答案或提示。
请帮我。
即使Stackoverflow也没有这个问题。在...
这个问题是可怕的问题,我建议你重写并澄清你究竟在问什么
同时,在进行逐位操作时,您必须熟悉二进制表示,特别是对于负数的二次表示
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));
尽管如此......什么是问题?