簡體   English   中英

Python-如果位和0x20 == 0x20

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM