[英]Python - Confused by if statement if bits&0x20==0x20
我對以下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)
不, &
是按位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)
有關按位運算如何工作的詳細信息,請參閱Wikipedia上的按位運算文章。 Python定義了幾個按位運算符 :
&
:AND |
: 要么 ^
:XOR <<
:左移 >>
:右移 發生的事情是正在測試字節的特定位。 例如,假設值是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輸出,當該位打開時將被激活(假定這些輸出在代碼中的前面都被立即關閉)。
這里要注意兩件事:
&
是按位與 ,而不是邏輯與 。 &
優先級高於==
,因此您的表達式被解析為(bits & 0x20) == 0x20
。 習慣用法x & mask
具有過濾x
的位的作用,從而僅保留mask
中為1
位。
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
精確當第六比特(是真b6
)是1 bits
。
如所寫,這有點多余:
if bits & 0x10 == 0x10: ...
測試是否設置了0x10位,可以將其更簡單地表示為
if bits & 0x10: ...
但是,如果您需要測試多個位,則可能不是多余的。
if bits & 0x11: ...
測試任一比特0×01或0×10位是否被設置;
if bits & 0x11 == 0x11: ...
測試是否同時設置了0x01和0x10位。
不,它是說“ bits&0x10”,它會對此求值,然后取其為零並檢查是否等於0x10。
我討厭按位十六進制(看它很奇怪),所以imma使用二進制
例如:
if 0b10000 & 0b10000 == 0b10000:
我使用0x11作為示例位
如果簡化,則評估為“(0b10001&0b10000)== 0b10000”或“ 0b10000 == 0b10000”,如果進一步簡化,則評估為“ True”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.