我对'&'感到困惑在下面的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)
答案 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,二进制是00010000
。 0x20
是第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
位的效果,只保留1
中mask
的位。
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”,如果你进一步简化,则评估为“真”。