正在发生的事情是正在测试字节的特定位。例如,假设值为 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 输出,该输出在该位打开时被激活(假设这些输出在代码的前面都立即关闭)。