嗨,我遇到了以下代码
numdigits = len(cardNumber)
oddeven = numdigits & 1
Run Code Online (Sandbox Code Playgroud)
到底发生了什么?我不确定"&"是做什么的.
dka*_*ins 41
该&标志是位AND运算符.与1一起使用时,它基本上会屏蔽该值以提取最低位,或者换句话说,它会告诉您该值是偶数还是奇数.
&运算符的更多信息有关更多信息,请参阅:http://wiki.python.org/moin/BitwiseOperators
编辑:添加此部分,因为这个答案得到了一些爱
将值与1进行AND运算表明该值是奇数还是偶数的原因最初可能并不明显.
数字的二进制表示基本上是每个2的幂的一系列YES或NO的总和,从最右边的数字开始向左移动,1,2,4,8 ......
只有一种方法可以用这种方式表示任何数字.例如,数字13(基数10)可以二进制写为"1101"(或十六进制为0xD,但不在该点旁边).看这里:
1 1 0 1
x x x x
8 4 2 1
= = = =
8 + 4 + 0 + 1 = 13
Run Code Online (Sandbox Code Playgroud)
请注意,除最右边的二进制数字外,所有其他1数字都会为总和添加偶数(即2的倍数).因此,获得奇数最终总和的唯一方法是从最右边的数字添加奇数1.因此,如果我们好奇数字是奇数还是偶数,我们可以查看它的二进制表示并忽略除最右边数字之外的所有数字.
为此,我们使用按位AND运算符.该值1以二进制表示为1:
0 0 0 1
x x x x
8 4 2 1
= = = =
0 + 0 + 0 + 1 = 1
Run Code Online (Sandbox Code Playgroud)
如果设置了最右边的位,如果不是1,1那么对这样的值进行AND 运算将导致该值0.
因为0在大多数语言中通常被认为是"假",而非零值被认为是"真实的",我们可以简单地说作为捷径:
if (value & 1): do_something_with_odd_value()...
Run Code Online (Sandbox Code Playgroud)
cry*_*ick 14
set1 = {0,1,2,3}
set2 = {2,3,4,5}
print(set1 & set2)
>>>set([2, 3])
Run Code Online (Sandbox Code Playgroud)
这是一个按位运算,在这种情况下,oddeven如果cardNumber有偶数个元素(否则为一个)分配零。
例如:假设len(cardNumber) == 235. 然后numdigits == 235,这是0b11101011二进制的。现在1是'0b00000001'二进制,当你“与”它们时,按位,你会得到:
11101011
&
00000001
----------
= 00000001
Run Code Online (Sandbox Code Playgroud)
同样,如果numdigits是 234,你会得到:
11101010
&
00000001
----------
= 00000000
Run Code Online (Sandbox Code Playgroud)
所以,它基本上是一种检查是否len(cardNumber) % 2. 可能是由具有 C 背景的人编写的,因为它不是很 Pythonic - 可读性很重要!