请帮我理解一下换班操作

nil*_*ils 0 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))])
Run Code Online (Sandbox Code Playgroud)

它需要一个列表并进行不同的组合(a,b,c)=((a,b,c),(a,b),(a,c)等.)但是这个范围是做什么的?从1到什么.我不明白"<<"

而且,如果(i&(1 << j))这是做什么的?它会检查i和2是否具有j的功率?对我没有任何意义:/ /

ick*_*fay 5

<<是二元左移运算符.1 << x是一种说x的力量的两种方式.


Mar*_*tos 5

range 函数返回从零到给定数字减一的数字列表。它还具有两个和三个参数的形式(有关更多信息,请参阅文档):

range(n) == [0, 1, 2, ..., n - 1]
Run Code Online (Sandbox Code Playgroud)

<< 是左移运算符,具有将左侧乘以 2 到右侧的幂的效果:

x << n == x * 2**n
Run Code Online (Sandbox Code Playgroud)

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

在 的秒用法中<<,左移被用作位掩码。它移动1位到Ĵ个位,并且执行一个位方式,所以结果将是非零的(并通过if测试),当且仅当Ĵ的第比特是集. 例如:

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)
Run Code Online (Sandbox Code Playgroud)

总之,x & (1 << y)为非零且仅当ÿ的第位X设置。