2 << 5
641000 >> 2
を取得したり250を取得したりすることができることに気付きました。
また、私は使用することができます>>
にprint
:
print >>obj, "Hello world"
ここで何が起きてるの?
2 << 5
641000 >> 2
を取得したり250を取得したりすることができることに気付きました。
また、私は使用することができます>>
にprint
:
print >>obj, "Hello world"
ここで何が起きてるの?
回答:
それは重要な質問だと思いますが、まだ答えられていません(OPはすでにシフト演算子について知っているようです)。答えてみましょう。あなたの例の>>演算子は、2つの異なる目的で使用されています。C ++の用語では、この演算子はオーバーロードされています。最初の例では、ビット単位の演算子(左シフト)として使用されますが、2番目のシナリオでは、出力リダイレクトとしてのみ使用されます。すなわち
2 << 5 # shift to left by 5 bits
2 >> 5 # shift to right by 5 bits
print >> obj, "Hello world" # redirect the output to obj,
with open('foo.txt', 'w') as obj:
print >> obj, "Hello world" # hello world now saved in foo.txt
Python 3では、次のようにファイル引数を直接指定できます。
print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt
__rshift__
and__lshift__
メソッドを介して実際にオーバーライドできます。
これらはビット単位のシフト演算子です。
ドキュメントからの引用:
x << y
x
ビットをy桁左にシフトして戻ります(右側の新しいビットはゼロです)。これは、を掛けるx
ことと同じ2**y
です。
x >> y
x
ビットをy桁右にシフトして戻ります。これは、分裂と同じであるx
ことで2**y
。
print bin(1)
、print bin(1 << 1)
、print bin(17)
、print bin(17 >> 1)
というように。説明なしでそれがどのように機能するかを見ることができます。
print >>obj, "Hello world"
2 << 5
と1000 >> 2
¯_(ツ)_ / ¯–
これらは、多くの主流のプログラミング言語に存在するビットシフト演算子で<<
あり、左シフトと>>
右シフトです。次の表に示すように、整数がメモリ内で1バイトしか使用しないと仮定します。
| operate | bit value | octal value | description |
| ------- | --------- | ----------- | -------------------------------------------------------- |
| | 00000100 | 4 | |
| 4 << 2 | 00010000 | 16 | move all bits to left 2 bits, filled with 0 at the right |
| 16 >> 2 | 00000100 | 4 | move all bits to right 2 bits, filled with 0 at the left |
関係するもう1つのケースprint >>obj, "Hello World"
は、Python 2のprint
ステートメントの「printchevron」構文です(Python 3で削除されfile
、print()
関数の引数に置き換えられました)。標準出力に書き込む代わりに、出力はobj.write()
メソッドに渡されます。典型的な例は、write()
メソッドを持つファイルオブジェクトです。最近の質問への回答を参照してください:Pythonで大なり記号を2倍にします。
これらはシフト演算子です
x << yビットをy桁左にシフトしてxを返します(右側の新しいビットはゼロです)。これは、xに2 ** yを掛けることと同じです。
x >> yyビットをy桁右にシフトしてxを返します。これは、xを2 ** yで//するのと同じです。
<< Mean any given number will be multiply by 2the power
for exp:- 2<<2=2*2'1=4
6<<2'4=6*2*2*2*2*2=64
Python2.7とPython3.8の両方で次のことを確認しました
print(100 << 3)を実行しました。100をバイナリに変換すると1100100になります。最初の3ビットを削除し、最後に値「0」を付けて3ビットを追加しました。したがって、結果は0100000になるはずで、これをDecimalに変換すると、答えは32でした。
print(100 << 3)を実行したときの驚きは、800でした。戸惑いました。何が起こっているのかを確認するために、800をバイナリに変換しました。そして、これは私が1100100000を得たものです。
800がPythonの答えであったことがわかると、最初の3ビットはシフトまたはドロップされませんでしたが、最後の3ビットに値「0」が追加されました。
print(100 >> 3)のように、完璧に機能しました。私は手動計算を行い、Pythonからの印刷結果をチェックしました。正しく動作しました。最後の3ビットを削除し、最初の3ビットに値「0」を追加しました。
(100 << 3)のように見えますが、左シフト演算子にはPythonのバグがあります。
<<
、>>
、&
、|
、~
、および^
ですか?