请帮我理解一下换班操作

时间:2011-03-22 08:40:25

标签: python bit-shift

def different(s):
   x = len(s)
   for i in range(1, 1 << x):
      u.append([s[j] for j in range(x) if (i & (1 << j))])

它需要一个列表并进行不同的组合

(a,b,c) = ((a,b,c),(a,b),(a,c) ...)

但是这个范围有什么作用?从1到什么。我不明白"<<"

而且,if (i & (1 << j))这是做什么的?它检查i和2是否为j的幂?对我没有任何意义。

2 个答案:

答案 0 :(得分:5)

<<是二元左移运算符。 1 << x是对x的力量说两句话的方式。

答案 1 :(得分:4)

范围函数返回从零到给定数字减去一的数字列表。它还有两个和三个参数形式(有关详细信息,请参阅doc):

range(n) == [0, 1, 2, ..., n - 1]

<<是左移运算符,其效果是左手边乘以右边的幂:

x << n == x * 2**n

因此,上述范围函数(range(1, 1 << x))返回[1, 2, 3, ..., 2**x - 1]

<<的秒使用中,左移用作位掩码。它将1位移入 j -th位,并使用 i 执行逐位,因此结果将为非-zero(并传递if测试)当且仅当 j -th位 i 被设置时。例如:

j = 4
1 << j = 0b1000 (binary notation)

i = 41 = 0b101001
i & (1 << j) = 0b101001
             & 0b001000
             = 0b001000 (non-zero, the if-test passes)

i = 38 = 0b100110
i & (1 << j) = 0b100110
             & 0b001000
             = 0b000000 (zero, the if-test fails)

简而言之,如果设置 x y 位,x & (1 << y)不为零。

相关问题