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的功率?对我没有任何意义:/ /
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设置。
| 归档时间: |
|
| 查看次数: |
2263 次 |
| 最近记录: |