使用;不是";及&&引用;检查偶数的运算符(Python)
我已经查看了类似于我的问题的堆栈溢出答案,但我没有找到可以解决我的问题(和)或以一种让我清楚的方式解释的答案。为了理解,我做了如下实验:使用;不是";及&&引用;检查偶数的运算符(Python),python,Python,我已经查看了类似于我的问题的堆栈溢出答案,但我没有找到可以解决我的问题(和)或以一种让我清楚的方式解释的答案。为了理解,我做了如下实验: def Even1(num): # I understand this and use it if num % 2 == 0: return num def Even2(num): return not (num & 1) def Even3(num): return not (num and 1) filte
def Even1(num): # I understand this and use it
if num % 2 == 0:
return num
def Even2(num):
return not (num & 1)
def Even3(num):
return not (num and 1)
filter(Even1, range(7)) ==> [2, 4, 6]
filter(Even2, range(7)) ==> [0, 2, 4, 6]
filter(Even3, range(7)) ==> [0]
1: not (4 & 1) = True
2: not (1 & 4) = True
3: not (4 & 2) = True
4: not (3 & 4) = True
5: not (4 & 3) = True
6: not (4 & 4) = False
7: not (3 & 1) = False
8: not (1 & 3) = False
9: not (3 & 2) = False
10: not (2 & 3) = False
11: not (3 & 3) = False
基于#1到#5,我认为在not(x&y)
排列中,任何偶数和任何其他数字的计算结果都是False(通过not更改为True)。我认为这与以下事实有关:bin(x)
wherex
is以0结尾,而奇数以1结尾。因此,not
可能会检查最后一位。但是#6否定了这一假设。以及数字的显示顺序
没有影响力
表达式#6与表达式#11除了各自求值相同/相等的数字外,还有什么共同之处
基于#7到#11,它看起来像是not(x&y)
中的奇数,其中x和y都是奇数,计算结果为True(通过not更改为False)。是这样吗
最后,Even2和Even3:将
和替换为和
。我知道第一个是按位的,第二个是逻辑的,但这意味着什么,所以我以结果结束。在Python中,1和0的布尔等价物分别是True
和False
。尽管Python中的任何非零值都被认为是True
如果执行偶数&1
操作,则得到0,因为任何偶数的最右位都是0。当您执行return not 0
时,从布尔角度来看,这相当于return not False
即return True
当您执行not(0和1)
时,这相当于not(False和True)
即not False
所以返回True
让我们通过一些测试,看看我们得到了什么:
not (4 & 1) = not 0100 & 0001 = not 0 = True
not (1 & 4) = not 0001 & 0100 = not 0 = True
not (4 & 2) = not 0100 & 0010 = not 0 = True
not (3 & 4) = not 0011 & 0100 = not 0 = True
not (4 & 3) = not 0100 & 0011 = not 0 = True
not (4 & 4) = not 1000 & 1000 = not 4 = False
not (3 & 1) = not 0011 & 0001 = not 1 = False
not (1 & 3) = not 0001 & 0011 = not 1 = False
not (2 & 3) = not 0010 & 0011 = not 2 = False
not (3 & 3) = not 0011 & 0011 = not 3 = False
在Python中,1和0的布尔等价物分别是True
和False
。尽管Python中的任何非零值都被认为是True
如果执行偶数&1
操作,则得到0,因为任何偶数的最右位都是0。当您执行return not 0
时,从布尔角度来看,这相当于return not False
即return True
当您执行not(0和1)
时,这相当于not(False和True)
即not False
所以返回True
让我们通过一些测试,看看我们得到了什么:
not (4 & 1) = not 0100 & 0001 = not 0 = True
not (1 & 4) = not 0001 & 0100 = not 0 = True
not (4 & 2) = not 0100 & 0010 = not 0 = True
not (3 & 4) = not 0011 & 0100 = not 0 = True
not (4 & 3) = not 0100 & 0011 = not 0 = True
not (4 & 4) = not 1000 & 1000 = not 4 = False
not (3 & 1) = not 0011 & 0001 = not 1 = False
not (1 & 3) = not 0001 & 0011 = not 1 = False
not (2 & 3) = not 0010 & 0011 = not 2 = False
not (3 & 3) = not 0011 & 0011 = not 3 = False
按位运算符通常用于在操作数之间逐位进行逻辑运算,从左到右使用相应的索引(相同的权重)位
你必须考虑操作数的二进制表示< /P>
例如:
>>> bin(4 & 6)
'0b100'
>>> bin(4)
'0b100'
>>> bin(6)
'0b110'
>>> bin(4 & 6)
'0b100'
>>> bin(8)
'0b1000'
>>> bin(4 & 8)
'0b0'
>>> bin(4 | 8)
'0b1100'
>>>
通常不会将这些操作数与逻辑操作数混合,但这并不常见
当使用二进制或十六进制术语进行思考时,位运算符非常有用,并且对于一组标志的紧凑表示也非常有用
示例(伪造):
以单个字节表示打印机状态,其中位0为1表示联机,位0表示脱机。位1表示卡纸,0表示纸张正常。对于打印机就绪,位3为1。你不在乎其他5位
假设
status = 0b10100101
请参阅最后三位:0b101
表示联机,纸张正常,准备就绪
将其设置为脱机(强制位0到0)
摆脱你不在乎的地位
my_status = status & 0b00000111 # same as my_status = status & 7
将标志设置为1,但保留不关心原始值的标志
status = status | 0b00000111
这里的0b
数字有时用十六进制表示法,甚至是十进制表示法(在这种情况下,让它们以神奇的眼神注视着阅读者的眼睛,而二进制和十六进制则让读者明白位值)数字被称为位掩码。它设置/取消设置所需位并保留其余位,具体取决于掩码值和按位运算符(
设置和&
重置)
现在您可以看到,在处理True
、False
、0
和空/非空对象时,您知道的逻辑运算符的规则有些不同。位运算符通常用于使用相应的索引(相同的权重)在操作数之间逐位进行逻辑运算从左向右位
你必须考虑操作数的二进制表示< /P>
例如:
>>> bin(4 & 6)
'0b100'
>>> bin(4)
'0b100'
>>> bin(6)
'0b110'
>>> bin(4 & 6)
'0b100'
>>> bin(8)
'0b1000'
>>> bin(4 & 8)
'0b0'
>>> bin(4 | 8)
'0b1100'
>>>
通常不会将这些操作数与逻辑操作数混合,但这并不常见
当使用二进制或十六进制术语进行思考时,位运算符非常有用,并且对于一组标志的紧凑表示也非常有用
示例(伪造):
以单个字节表示打印机状态,其中位0为1表示联机,位0表示脱机。位1表示卡纸,0表示纸张正常。对于打印机就绪,位3为1。你不在乎其他5位
假设
status = 0b10100101
请参阅最后三位:0b101
表示联机,纸张正常,准备就绪
将其设置为脱机(强制位0到0)
摆脱你不在乎的地位
my_status = status & 0b00000111 # same as my_status = status & 7
将标志设置为1,但保留不关心原始值的标志
status = status | 0b00000111
这里的0b
数字有时用十六进制表示法,甚至是十进制表示法(在这种情况下,让它们以神奇的眼神注视着阅读者的眼睛,而二进制和十六进制则让读者明白位值)数字被称为位掩码。它设置/取消设置所需位并保留其余位,具体取决于掩码值和按位运算符(
设置和&
重置)
现在,您可以看到,在处理True
、False
、0
和空/非空对象时,您知道的逻辑运算符的规则有点不同……按照您的解释方式讲得通。但是二进制字符串中的所有位都要求值,否则not(4&2)
和not(4&4)
的求值结果是相同的