2

我正在努力理解“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
4

3 回答 3

6

它检查是否设置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]

(尝试打印icombo在内循环内。)

于 2013-04-30T21:45:43.640 回答
3

随着操作的进行,您可以打印二进制数字以查看其工作原理。这是一个 i=1234 和 j=4 的示例。

1234 二进制

>>> '{:b}'.format(1234)
'10011010010'

右移 4 位会导致最右边的位 (0010) 消失

>>> '{:b}'.format(1234>>4)
'1001101'

模运算除以 2 并给出余数

>>> '{:b}'.format((1234>>4)%2)
'1'

使用 & 操作也很常见

>>> '{:b}'.format((1234>>4)&1)
'1'

如果你有一个第 4 位(从零开始)为零的数字,你得到一个零

>>> '{:b}'.format((1234+0b10000>>4)&1)
'0'
于 2013-04-30T22:18:38.750 回答
0

作为 larsmans 已经完成的解决方案的另一种风格,这就是我的理解。

i >> j 仅表示 i/pow(2,j),在数学上表示 i/2^j [显然我们在整数空间中]。让我们设置 n=i/2^j。当您有 n % 2 == 1 时,您会问 n mod 2 是否为 1?如果是,则 n 必须是奇数,否则 n 必须是偶数。

来源: http ://docs.python.org/2/reference/expressions.html

于 2013-04-30T22:22:56.883 回答