0

演算子、キーワードなどのリストをまとめましたが、理解できないのは Python の >> または << だけです。

>> と << の背後にある数学を説明してください。

ありがとうございました。

4

3 に答える 3

11

これらはビットごとのシフト演算子です。数学的には、これらは、右オペランドの 2乗 ( <<) または除算 ( )と同等です。>>

  • x << yは と数学的に同等x * (2 ** y)です。
  • x >> yは と数学的に同等x / (2 ** y)です。

これらは、ビットフラグを操作または検査するときによく使用されます。つまり、見かけの数値ではなく、ビットがオンまたはオフになるという実際の意味を持つ数値です。これは、一連のブール値をコンパクトに表すのに役立ちます。方法。

あなたの特定のケースで100 >> 5は、は(上記の同等性により)と同じ100 / (2 ** 5)です。べき乗演算子を単純化すると、 が得られ100 / 32ます。この除算の結果は 3.125 ですが、シフト演算子は (デフォルトで) 整数にのみ適用されるため、結果は切り捨てられます。

(これらの演算子は実際には、2 進数を構成する 1 と 0 を左または右にシフトする方法として実装されているため、ハードウェアは実際には数学的な観点から除算を行っていません。ただし、10 進数の "12345" と2 桁右にシフトし、小数部分を削除すると、「123」が得られます. 基本的に、数値を 10 で割って 2 乗 (または 100) し、切り捨てます>>。コンピュータは基数 2 の算術演算を使用するため、基数 2 です。)

于 2013-05-23T21:49:06.407 に答える
4

ビットシフトを理解するには、バイナリ表現を見るのが最善です

>>> bin(100)
'0b1100100'
>>> bin(100>>1)
'0b110010'
>>> bin(100>>2)
'0b11001'
>>> bin(100>>3)
'0b1100'
>>> bin(100>>4)
'0b110'
>>> bin(100>>5)
'0b11'
>>> bin(3)
'0b11'
>>> bin(100>>5) == bin(3)
True

2 進数で考えていない場合、<< nは で乗算することと同じ2**nであり、>> nは で除算することと同じ2**nです。除算の端数は破棄されます。

于 2013-05-23T22:58:23.533 に答える
3

これらは、あなたの場合の左右のビットシフト演算子です。ただし、Python は、他の多くの言語と同様に、演算子のオーバーロードをサポートしているため、他の目的に使用できます。あなたの例では、右に5桁シフトしたときのよう100にバイナリで表されます is 、またはbase 10 3110010011

于 2013-05-23T21:50:34.553 に答える