您好我遇到了以下代码
numdigits = len(cardNumber)
oddeven = numdigits & 1
到底发生了什么?我不确定“&”是什么正在做。
答案 0 :(得分:33)
&
符号是按位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
请注意,除最右边的二进制数字外,所有其他1
数字都会为总和添加偶数(即2的倍数)。因此,获得奇数最终总和的唯一方法是从最右边的数字添加奇数1。因此,如果我们好奇数字是奇数还是偶数,我们可以查看它的二进制表示并忽略除最右边数字之外的所有数据。
为此,我们使用按位AND运算符。二进制中的值1
表示为1
:
0 0 0 1
x x x x
8 4 2 1
= = = =
0 + 0 + 0 + 1 = 1
如果值设置为1
,则设置为1
的值将导致0
,如果设置了最右边的位,则为0
。
因为if (value & 1): do_something_with_odd_value()...
在大多数语言中通常被视为“假”,而非零值被视为“真”,我们可以简单地说为快捷方式:
{{1}}
答案 1 :(得分:10)
此外,&
为also used,用于取两个Python sets的交集:
set1 = {0,1,2,3}
set2 = {2,3,4,5}
print(set1 & set2)
>>>set([2, 3])
答案 2 :(得分:4)
这是一个按位操作,在这种情况下,如果oddeven
具有偶数个元素(否则为一个),则为cardNumber
分配零。
举个例子:假设len(cardNumber) == 235
。然后numdigits == 235
,即二进制0b11101011
。现在1
是二进制的'0b00000001'
,当你按顺序“和”它们时,你会得到:
11101011
&
00000001
----------
= 00000001
同样,如果numdigits
为234,您将得到:
11101010
&
00000001
----------
= 00000000
所以,它基本上是一种检查len(cardNumber) % 2
的混淆方式。可能是由具有C背景的人写的,因为它不是非常pythonic - 可读性很重要!
答案 3 :(得分:3)
&
是bitwise and,这是进行位级计算的有效方法。它正在numdigits
并逐一地与1
进行比较。
答案 4 :(得分:1)