【发布时间】:2012-01-23 06:44:18
【问题描述】:
您好,我遇到了以下代码
numdigits = len(cardNumber)
oddeven = numdigits & 1
这里到底发生了什么?我不确定“&”在做什么。
【问题讨论】:
-
与 Java 或 C# 或(仅在类似的上下文中)C 或 C++ 中的相同。
标签: python
您好,我遇到了以下代码
numdigits = len(cardNumber)
oddeven = numdigits & 1
这里到底发生了什么?我不确定“&”在做什么。
【问题讨论】:
标签: python
& 符号是位与运算符。与 1 一起使用,它基本上会屏蔽该值以提取最低位,或者换句话说,它会告诉您该值是偶数还是奇数。
& 运算符的信息欲了解更多信息,请参阅:http://wiki.python.org/moin/BitwiseOperators
编辑:添加此部分,因为这个答案得到了一些喜爱
将一个值与 1 进行与运算来判断该值是奇数还是偶数的原因起初可能并不明显。
一个数字的二进制表示本质上是一系列 YES 或 NO 的总和,对于从最右边的数字开始向左移动的每个 2 的幂,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。因此,如果我们想知道一个数字是奇数还是偶数,我们可以查看它的二进制表示并忽略除最右边的数字之外的所有内容。
为此,我们使用按位与运算符。二进制值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()...
【讨论】:
& 是also used 用于取两个Python sets 的交集:
set1 = {0,1,2,3}
set2 = {2,3,4,5}
print(set1 & set2)
>>>set([2, 3])
更一般地说,Python 允许 operator overloading,这意味着您可以编写重新解释 & 操作符的类的类。这就是 Pandas 和 Numpy 等库劫持 & 的方式。
【讨论】:
这是一个按位运算,在这种情况下,如果 cardNumber 具有偶数个元素(否则为一个),则将零分配给 oddeven。
例如:假设len(cardNumber) == 235。然后numdigits == 235,即二进制的0b11101011。现在1 是二进制的'0b00000001',当你按位“与”它们时,你会得到:
11101011
&
00000001
----------
= 00000001
同样,如果numdigits 是 234,你会得到:
11101010
&
00000001
----------
= 00000000
所以,这基本上是一种检查len(cardNumber) % 2 是否为混淆的方式。可能是有 C 背景的人写的,因为它不是很 Python —— 可读性很重要!
【讨论】:
& 是bitwise and,这是一种进行位级计算的有效方法。它使用numdigits 并与1 逐位进行。
【讨论】:
【讨论】: