0

以下の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)
4

5 に答える 5

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 進数)、つまり 10 進数の 16 は 2 進数であるため00010000です。0x20は 6 番目のビット、0x40は 7 番目、0x80は左端または 8 番目のビットです。

コードは必要以上に冗長です。1 つのビットだけをテストする場合、オペレーターが返す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)

ビット演算がどのように機能するかの詳細については、ウィキペディアのビット演算に関する記事を参照してください。Python では、いくつかのビット演算子が定義されています。

  • &: と
  • |: また
  • ^: XOR
  • <<: 左方移動
  • >>: 右シフト
于 2013-05-06T19:01:32.410 に答える
2

何が起こっているかというと、バイトの特定のビットがテストされているということです。たとえば、値が 0xAF または 10 進数の 175 であるとします。

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

ここで、上記のビット 5 が設定されているかどうかをテストします。そのため、そのビット セットだけを含むマスクを作成します。これはステンシルのようなもので、マスクに 1 がある特定のビットのみを「透けて見える」ようにするため、マスクと呼ばれます。マスク内の 0 ビットは「マスク オフ」され、その値は気にしません。

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

これで、ビットごとの and演算を使用して値をテストできます。「ビットごと」とは、一方の値の各ビットが他方の対応するビットに対してテストされることを意味し、「and」とは、元の値の両方でビットが設定されている場合にのみ、結果のビットが設定されることを意味します。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 出力に対応しており、ビットがオンになるとアクティブになります (おそらく、これらの出力はすべて、コードの前半で一度にオフになります)。

于 2013-05-06T19:15:05.930 に答える
1

ここで注意すべき点は次の 2 つです。

  • &論理andではなく、ビット単位のandです。
  • &よりも優先順位が高い==ため、式は として解析され(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です。

于 2013-05-06T19:09:46.677 に答える
1

書かれているように、これは少し冗長です:

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

ビット 0x10 が設定されているかどうかをテストします。これは、次のように簡単に表現できます。

if bits & 0x10: ...

ただし、複数のビットをテストする必要がある場合は、冗長ではない可能性があります。

if bits & 0x11: ...

ビット 0x01 またはビット 0x10 が設定されているかどうをテストします。

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

ビット 0x01 と 0x10の両方が設定されているかどうかをテストします。

于 2013-05-06T19:10:38.790 に答える
0

いいえ、「ビットと0x10」と言って、それを評価し、それが何であれ、0x10に等しいかどうかを確認します。

私は16進数のビット単位が嫌いなので(その奇妙なものを見るために)、バイナリを使用する

例えば:

if 0b10000 & 0b10000 == 0b10000:

ビット例に0x11を使用しています

単純化すると "(0b10001 & 0b10000 ) == 0b10000 " または "0b10000 == 0b10000 " と評価され、さらに単純化すると単に "True" と評価されます。

于 2013-05-06T19:09:54.863 に答える