位操作-循环通过非连续的位位置



如何迭代由给定掩码m(权重为n)定义的n非连续位组成的2^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)。

诀窍在于如何从上一个值转换到下一个值。

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

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

相关内容

  • 没有找到相关文章

最新更新