python 中的 & 是什么意思[重复]
- 2025-03-17 09:10:00
- admin 原创
- 32
问题描述:
我遇到了以下代码
numdigits = len(cardNumber)
oddeven = numdigits & 1
这里到底发生了什么?我不确定“&”在做什么。
解决方案 1:
回答
该&
符号是按位 AND 运算符。与 1 一起使用,它基本上会屏蔽值以提取最低位,换句话说,它会告诉您该值是偶数还是奇数。
有关 Python&
运算符的更多信息
有关更多信息,请参阅:http://wiki.python.org/moin/BitwiseOperators
为什么检查奇数和偶数是有效的
编辑:添加此部分,因为这个答案得到了一些喜爱
通过对一个值与 1 进行“与”运算来判断该值是奇数还是偶数,这一点一开始可能并不明显。
数字的二进制表示本质上是 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()...
解决方案 2:
&
也用于求两个Python 集合的交集:
set1 = {0,1,2,3}
set2 = {2,3,4,5}
print(set1 & set2)
>>>set([2, 3])
更一般地,Python 允许运算符重载,这意味着你可以编写类来重新解释运算符的作用。这就是Pandas和Numpy&
等库劫持的方式。&
解决方案 3:
oddeven
这是一个按位运算,在这种情况下,如果cardNumber
元素数量为偶数,则分配零(否则分配一)。
举个例子:假设len(cardNumber) == 235
。然后numdigits == 235
,0b11101011
以二进制表示。现在1
是'0b00000001'
二进制,当你按位“AND”它们时,你会得到:
11101011
&
00000001
----------
= 00000001
类似地,如果numdigits
是 234,则会得到:
11101010
&
00000001
----------
= 00000000
因此,这基本上是一种检查是否 的模糊方法len(cardNumber) % 2
。可能是由具有 C 背景的人编写的,因为它不太符合 Python 风格 - 可读性很重要!
解决方案 4:
&
是按位与,这是进行位级计算的有效方法。它是逐位取numdigits
并将其与 进行与运算。1
解决方案 5:
它是一个二进制按位“与”运算符。