Python - 如果位和& 0x20 == 0x20,则由if语句混淆

时间:2013-05-06 18:59:30

标签: python if-statement

我对'&'感到困惑在下面的if语句中。 如果说“如果位 0x10 = 0x10”

,那就是拳头
def lcd_byte(bits, mode):
  if bits&0x10==0x10:
    GPIO.output(LCD_D4, True)
  if bits&0x20==0x20:
    GPIO.output(LCD_D5, True)
  if bits&0x40==0x40:
    GPIO.output(LCD_D6, True)
   if bits&0x80==0x80:
    GPIO.output(LCD_D7, True)

5 个答案:

答案 0 :(得分:7)

不,& 按位AND ,而不是布尔 AND 。对于操作数值的每个位,按位 AND 在二进制级别上工作。

因此,使用值1和0得到:

1 & 1 == 1
1 & 0 == 0
0 & 1 == 0
0 & 0 == 0

但是对于整数值,在二进制中,将由多个位组成,运算符代替每个位对:

2 & 1 == 0
2 & 2 == 2

表达式& 0x10测试是否设置了第5位:

0b00010000 & 0x10 == 0x10

因为0x10(十六进制)或十进制16,二进制是000100000x20是第6位,0x40是第7位,0x80是最左边或第8位。

代码比需要的更冗长;当仅针对一位进行测试时,运算符将返回0或经过测试的位,并且==部分可以省略:

def lcd_byte(bits, mode):
    if bits & 0x10:
        GPIO.output(LCD_D4, True)
    if bits & 0x20:
        GPIO.output(LCD_D5, True)
    if bits & 0x40:
        GPIO.output(LCD_D6, True)
    if bits & 0x80:
        GPIO.output(LCD_D7, True)

请参阅维基百科上的Bitwise operations文章,了解有关按位操作如何工作的详细信息。 Python定义several bitwise operators

  • &:AND
  • |:或
  • ^:XOR
  • <<:左移
  • >>:右移

答案 1 :(得分:2)

正在发生的是正在测试字节的特定位。例如,假设值为0xAF或十进制,175。在二进制文件中:

bit    7654 3210
----------------
value  1010 1111

现在我们要测试一下是否设置了上面的第5位。所以我们创建一个只包含该位的掩码。它被称为掩码,因为它就像一个模板,只允许某些位“显示”掩码中有1的位置。掩码中的0位被“屏蔽掉”,我们不关心它们的值。

bit    7654 3210
----------------   =   0x20 or 32 in decimal
value  0010 0000

现在我们可以使用按位和操作来测试该值。 “按位”是指一个值中的每个位与另一个中的相应位进行测试,而“和”是指只有在两个原始值中设置该位时才设置结果位。在Python中,此操作编写为&

ORIGINAL VALUE          MASK                    RESULT

bit    7654 3210        bit    7654 3210        bit    7654 3210
----------------   &    ----------------   =    ----------------
value  1010 1111        value  0010 0000        value  0010 0000

现在我们看一下结果。如果结果不为零,那么我们就知道该位是以原始值设置的。

现在,您发布的Python代码实际上不会检查它是否为非零,而是检查它是否是实际的掩码值。如果您一次测试多个位,则只需要执行此操作,只需在掩码中包含多个1位即可。在这种情况下,如果在原始值中设置任何相应位,则结果为非零。有时这就是你想要的,但是如果你想确保设置所有,那么你需要明确地将结果与掩码值进行比较。

在这个具体示例中,每个位对应一个特定的GPIO输出,该位在该位打开时被激活(可能这些输出在代码中早先都被关闭)。

答案 2 :(得分:1)

这里有两点需要注意:

  • &是按位,不是逻辑
  • &的优先级高于==,因此您的表达式会被解析为(bits & 0x20) == 0x20

习语x & mask具有过滤x位的效果,只保留1mask的位。

bits        : b8 b7 b6 b5 b4 b3 b2 b1
0x20        :  0  0  1  0  0  0  0  0
===================================== 
bits & 0x20 :  0  0 b6  0  0  0  0  0

因此,当bits & 0x20 == 0x20中的第6位(b6)为1时,bits恰好为真。

答案 3 :(得分:1)

如上所述,这有点多余:

if bits & 0x10 == 0x10: ...

测试是否设置了位0x10,可以更简单地表示为

if bits & 0x10: ...

但是,如果您需要测试多个位,则可能不会多余。

if bits & 0x11: ...

测试是否 位0x01或位0x10设置;

if bits & 0x11 == 0x11: ...

测试是否位0x01和0x10都已设置。

答案 4 :(得分:0)

不,它会说“bit&amp; 0x10”它会对此进行评估,然后它会采取任何操作并检查是否等于0x10。

我讨厌十六进制(看看它的怪异)所以imma使用二进制

例如:

if 0b10000 & 0b10000 == 0b10000:

我使用0x11作为例如位

如果你简化,

被评估为“(0b10001&amp; 0b10000)== 0b10000”或“0b10000 == 0b10000”,如果你进一步简化,则评估为“真”。