4

<<=演算子と|=演算子は Python を意味しますか? 私はそれらがビット単位の演算子だと思います。演算子|(ビットごとの or) と<<(ビットシフト) は知っていますが、. との組み合わせはわかりません=

このピースコードで見つけました。以下のコードはそのコードに属します。

commandout = adcnum
commandout |= 0x18  # start bit + single-ended bit
commandout <<= 3    # we only need to send 5 bits here
for i in range(5):
    if (commandout & 0x80):
        GPIO.output(mosipin, True)
    else:
        GPIO.output(mosipin, False)
    commandout <<= 1
    GPIO.output(clockpin, True)
    GPIO.output(clockpin, False)
4

2 に答える 2

8

どちらもインプレース割り当てです。彼らは効果的name = name op right-hand-expressionにちょうどのスペースであなたを与えますname op= right-hand-expression.

したがって、あなたの例では、次のように読むことができます。

commandout = commandout | 0x18
commandout = commandout << 3

これらの操作専用のフックを使用すると、左側のオブジェクトが何か特別なことを選択できるため、少し単純化しすぎています。list += rhsは実際list.extend(rhs)にはたとえば、ではありませんlist = list + rhs。インプレース演算子はself、新しいオブジェクトを作成する代わりに、可変オブジェクトに変更を適用する機会を与えます。

ただし、あなたの例でcommandoutは、 int であると推測されますが、不変の値があり、インプレース操作新しい値を返す必要があります。

于 2013-04-06T13:36:49.400 に答える
2

これらはビット算術演算子です。C と同じスタイル演算子を使用して、LH 値をその場で変更します (または、lh が不変の場合は、lh 値を新しい計算値に再割り当てします)。

Python では、これらをシフト演算子(<<および>>) およびバイナリ ビット演算子( &^および) と呼んでいます|

演算子の後に the を追加すると=、代入は元の LH 名に戻ります。そのため、in- |=placeor<<=in-place left shift が実行されます。

つまり、左に 3 桁シフトした x ビットの値x<<=3と同じです。x=x<<3

ビットシフト:

>>> b=0x1
>>> b<<=3
>>> bin(b)
'0b1000'

>>> b>>=2
>>> bin(b)
'0b10'

ビットまたは:

>>> bin(b)
'0b1'
>>> bin(c)
'0b100'
>>> c|=b
>>> bin(c)
'0b101'

技術的には、LH 値が不変の場合、結果は値の実際のインプレース変換ではなく、LH 名に再バインドされます。

これは、アイテムのアドレスを調べることで表示できます。

>>> id(i)
4298178680       # original address (in CPython, id is the address)
>>> i<<=3
>>> id(i)
4298178512       # New id; new int object created

C を使用する場合とは異なり (この場合はctypes ):

>>> import ctypes
>>> i=ctypes.c_int(1)
>>> ctypes.addressof(i)
4299577040
>>> i.value<<=3
>>> ctypes.addressof(i)
4299577040

C 整数は変更可能であるため、ビット シフトはその場で行われ、C 整数の新しいアドレスはありません。

于 2013-04-06T13:37:02.463 に答える