Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用;不是";及&&引用;检查偶数的运算符(Python)_Python - Fatal编程技术网

使用;不是";及&&引用;检查偶数的运算符(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)
where
x
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)
的求值结果是相同的