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的幂?对我没有任何意义。
答案 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)
不为零。