努力理解python中的按位运算符

Pad*_*ham 2 python bit-manipulation

我正在努力理解"if(i >> j)%2 == 1"在以下函数或任何函数中的作用是什么?

def powerSet(items):

    N = len(items)
    for i in xrange(2**N): 
               combo = []
        for j in xrange(N):
            if (i >> j) % 2 == 1:
                combo.append(items[j])
        yield combo
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 5

它检查是否设置了从末尾开始计数j的二进制数的第二位i.i >> j右移,所以最后一点j都消失了.n % 2 == 1是奇数的常见检查,二进制的最后一位设置.

编辑:这是生成如下的功率集.外循环遍历所有2**N子集items,每个子集表示为二进制整数.然后内部循环通过检查N这些整数的哪个最终位被设置来构造实际子集,使用位作为子集成员资格的指示符.

例如,假设N=5.然后在某个时候,i将是0b10011.[items[0], items[1], items[4]]由此,可以构建该集合.首先反转这些位,因为它们从右到左编号为j:

1          1         0          0          1
items[0]   items[1]  (nothing)  (nothing)  items[4]
Run Code Online (Sandbox Code Playgroud)

(尝试打印icombo在内循环内部.)