Pythonで>>と<<はどういう意味ですか?


94

2 << 5641000 >> 2を取得したり250を取得したりすることができることに気付きました。

また、私は使用することができます>>print

print >>obj, "Hello world"

ここで何が起きてるの?



3
ここで、これらのシンボルを検索エンジンに接続して、実際に検索させることができます。symbolhound.com
user2357112はMonicaApr


3
@ user2357112それは本当に役に立ちます。ありがとう。そして、それが基本的な質問だと言う人には、そうかもしれませんが、ビット単位の演算子の概念がなかったので、ドキュメントでそれを調べるとは思わなかったでしょう...
user3201152 2014

@joaquinこれは、Google forpythonでの大なり記号の最大の結果になりました。
ジョーダンライター2016

回答:


64

それは重要な質問だと思いますが、まだ答えられていません(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

13
参考までに、Pythonコードで見られる可能性のある右シフト演算子の別の一般的な使用法はAirflowファイルで発生します。:エアフローフレームワークは、一つのタスクが他の上流であることを示すために「>>」演算子をオーバーロードstackoverflow.com/questions/52389105/...
schimmy

3
これらの演算子は、__rshift__and__lshift__メソッドを介して実際にオーバーライドできます。
trudolf

2 >> 5は0に等しいと思います。0.0001に等しいはずだと思いましたか?
lightbox1 4220年

1
@ teter123f操作はバイナリです。10進演算ではありません。
yosemite_k

62

これらはビット単位のシフト演算子です。

ドキュメントからの引用:

x << y

xビットをy桁左にシフトして戻ります(右側の新しいビットはゼロです)。これは、を掛けるxことと同じ2**yです。

x >> y

xビットをy桁右にシフトして戻ります。これは、分裂と同じであるxことで2**y


2
おそらく例では、助けてPythonでこれらのシリーズを入力します。print bin(1)print bin(1 << 1)print bin(17)print bin(17 >> 1)というように。説明なしでそれがどのように機能するかを見ることができます。
bartekbrak 2015年

4
ビットシフト演算子には2つのオペランドが必要ですが、なぜオペランドが「印刷」で、オペランド2がオブジェクトなのですか?以下のようにprint >>obj, "Hello world"
チーファン

これは、OPが提供した(したがってOPに知られている)コンテキストに対する回答であり、尋ねられた質問に対する回答ではありません。
z33k

1
@Qi Fan @ z33k質問は、この回答が書かれてから1年以上後に印刷するための参照を追加するように編集されました。言及された元の質問2 << 51000 >> 2 ¯_(ツ)_ / ¯–
ジェームズ

26

12 << 2

48

上記のステートメントを実行すると、12の実際のバイナリ値は「001100」になります。左シフト(2桁左にシフト)は値48を返し、そのバイナリ値は「110000」です。

48 >> 2

12

48のバイナリ値は「110000」です。上記のステートメントを実行した後、右シフト(2桁右シフト)は値12を返し、そのバイナリ値は「001100」です。


13

これらは、多くの主流のプログラミング言語に存在するビットシフト演算子で<<あり、左シフトと>>右シフトです。次の表に示すように、整数がメモリ内で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 |

この説明を正確に検索します。
shaikmoeed20年1

12

関係するもう1つのケースprint >>obj, "Hello World"は、Python 2のprint ステートメントの「printchevron」構文です(Python 3で削除されfileprint() 関数の引数に置き換えられました)。標準出力に書き込む代わりに、出力はobj.write()メソッドに渡されます。典型的な例は、write()メソッドを持つファイルオブジェクトです。最近の質問への回答を参照してください:Pythonで大なり記号を2倍にします


7

これらはシフト演算子です

x << yビットをy桁左にシフトしてxを返します(右側の新しいビットはゼロです)。これは、xに2 ** yを掛けることと同じです。

x >> yyビットをy桁右にシフトしてxを返します。これは、xを2 ** yで//するのと同じです。



-1

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のバグがあります。


バグはありません。数値あたり8ビットに制限されていません。
OSO

<<演算子と>>演算子はどちらも同じロジックで動作する必要があります。ただし、<<演算子の動作は異なります。私はPythonで動作バグを報告しました。
ナンディッシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.