循环通过非连续位位置

时间:2015-06-27 06:08:31

标签: bit-manipulation

如何遍历2^n值,这些值由给定掩码n(汉明重量m)定义的n非连续位组成。

示例:16位变量,n=3m=0x0103。 生成的2^3=8值应为:

    (binary)         (hex)
0000000000000000    0x0000
0000000000000001    0x0001
0000000000000010    0x0002
0000000000000011    0x0003
0000000100000000    0x0100
0000000100000001    0x0101
0000000100000010    0x0102
0000000100000011    0x0103

我相信这可以在c*2^n操作中完成,适用于小c(1或2)。

1 个答案:

答案 0 :(得分:2)

诀窍是如何从前一个值到下一个值。

mask = 0b0000000100000011
invmask = (~mask & (1 << 16) - 1)

curr = 0
for i in range(16):
        print "{0:016b}".format(curr)
        curr = ((curr | invmask) + 1) & mask

它给出了:

0000000000000000
0000000000000001
0000000000000010
0000000000000011
0000000100000000
0000000100000001
0000000100000010
0000000100000011
0000000000000000
0000000000000001
0000000000000010
0000000000000011
0000000100000000
0000000100000001
0000000100000010
0000000100000011

感谢您提出这个非常有趣的问题。