Что означают >> и << в Python?

90

Я замечаю, что могу 2 << 5получить 64 и 1000 >> 2250.

Также могу использовать >>в print:

print >>obj, "Hello world"

Что здесь происходит?

user3201152
источник
3
Вот теперь вы можете вставить эти символы в поисковую систему и заставить ее искать их: symbolhound.com
user2357112 поддерживает Монику
возможный дубликат Bitwise Operation and Usage
vaultah
3
@ user2357112 Это будет действительно полезно, спасибо. И для тех, кто говорит, что это базовый вопрос, может быть, но у меня не было понятия о побитовых операторах, поэтому я бы никогда не подумал найти это в документации ...
user3201152 03
@joaquin теперь результат номер один в Google для python больше чем больше чем.
Jordan Reiter

Ответы:

63

Я думаю, что это важный вопрос, и на него еще нет ответа (OP, похоже, уже знает об операторах сдвига). Позвольте мне попытаться ответить, оператор >> в вашем примере используется для двух разных целей. В терминах C ++ этот оператор перегружен. В первом примере он используется как побитовый оператор (сдвиг влево), а во втором сценарии он используется просто как перенаправление вывода. т.е.

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
yosemite_k
источник
11
К вашему сведению, еще одно распространенное использование оператора сдвига вправо, которое вы можете увидеть в коде Python, будет происходить в файлах Airflow. Платформа Airflow перегружает оператор '>>', чтобы указать, что одна задача находится выше по течению от другой: stackoverflow.com/questions/52389105/…
Schimmy 05
3
вы можете переопределить эти операторы через __rshift__и __lshift__методы.
Трудольф
Я получаю, что 2 >> 5 равно 0. Я думал, должно быть равно 0,0001?
lightbox142
1
@ teter123f операция двоичная. это не десятичная операция.
yosemite_k
61

Это операторы побитового сдвига.

Цитата из документов :

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
4
Оператору битового сдвига требуется 2 операнда, так почему же операнд является «печатью», а операнд 2 - объектом? as inprint >>obj, "Hello world"
Qi Fan
Это ответ на контекст, предоставленный OP (и, следовательно, известный OP), а не на заданный вопрос.
z33k
@Qi Fan @ z33k Вопрос был отредактирован, чтобы добавить ссылку для печати более чем через год после написания этого ответа. В исходном вопросе упоминается только 2 << 5и 1000 >> 2 ¯_ (ツ) _ / ¯
Джеймс
24

12 << 2

48

Фактическое двоичное значение 12 равно «00 1100», когда мы выполняем вышеуказанный оператор. Сдвиг влево (сдвиг влево на 2 позиции) возвращает значение 48, его двоичное значение равно «11 0000».

48 >> 2

12

Двоичное значение 48 равно «11 0000», после выполнения вышеуказанного оператора «Сдвиг вправо» (сдвиг вправо на 2 разряда) возвращает значение 12, его двоичное значение равно «00 1100».

PAC
источник
12

Другой случай print >>obj, "Hello World"- это синтаксис «print chevron» для print оператора в Python 2 (удален в Python 3, заменен fileаргументом print() функции ). Вместо записи в стандартный вывод вывод передается в obj.write()метод. Типичным примером могут быть файловые объекты, имеющие write()метод. См. Ответ на более свежий вопрос: двойной знак «больше» в Python .

chrstphrchvz
источник
11

Это оператор битового сдвига, который существует во многих основных языках программирования, <<это левый сдвиг и >>правый сдвиг, их можно продемонстрировать в следующей таблице, предполагая, что целое число занимает только 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 |
Цинджи
источник
Точно ищу это объяснение.
Шаик Моид
7

Это операторы сдвига

x << y Возвращает x со смещением битов влево на y позиций (а новые биты справа равны нулю). Это то же самое, что и умножение x на 2 ** y.

x >> y Возвращает x со смещением битов вправо на y позиций. Это то же самое, что // присвоить x на 2 ** y.

доктор любовь
источник
0
<< 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
Mayank Awasthi
источник