演算子、キーワードなどのリストをまとめましたが、理解できないのは Python の >> または << だけです。
>> と << の背後にある数学を説明してください。
ありがとうございました。
演算子、キーワードなどのリストをまとめましたが、理解できないのは Python の >> または << だけです。
>> と << の背後にある数学を説明してください。
ありがとうございました。
これらはビットごとのシフト演算子です。数学的には、これらは、右オペランドの 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 です。)
ビットシフトを理解するには、バイナリ表現を見るのが最善です
>>> 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
です。除算の端数は破棄されます。
これらは、あなたの場合の左右のビットシフト演算子です。ただし、Python は、他の多くの言語と同様に、演算子のオーバーロードをサポートしているため、他の目的に使用できます。あなたの例では、右に5桁シフトしたときのよう100
にバイナリで表されます is 、またはbase 10 31100100
11