位操作(遍历所有子集)

问题描述 投票:-1回答:1

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

我已经尝试了我能做的一切 - 但没有进展。

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

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

我搜索谷歌像'位操纵'或'位子集迭代',但没有答案或提示。

请帮我。

即使Stackoverflow也没有这个问题。在...

bit-manipulation bit bitmask
1个回答
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));

尽管如此......什么是问题?

© www.soinside.com 2019 - 2024. All rights reserved.