Бинарный сдвиг влево и бинарный сдвиг вправо
Python предлагает еще одну операцию, связанную с отдельными битами: сдвиг. Это применяется только к целым значениям, и Вы не должны использовать для него числа с плавающей запятой в качестве аргумента.
Вы уже применяете эту операцию очень часто и совершенно бессознательно. Как умножить любое число на десять? Посмотрите:
12345 × 10 = 123450
Как видите, умножение на десять - это фактически сдвиг всех цифр влево и заполнение полученного пробела нулем.
Деление на десять? Посмотрите:
12340 ÷ 10 = 1234
Деление на десять - это не что иное, как сдвиг цифр вправо.
Компьютер выполняет такую же операцию, но с одним отличием: поскольку два - это основание для двоичных чисел (не 10), сдвиг значения на один бит влево, таким образом, соответствует его умножению на два; соответственно, сдвиг на один бит вправо аналогичен делению на два (обратите внимание, что самый правый бит теряется).
Операторы сдвига в Python представляют собой пару диграфов: <<
и >>
, ясно говорящих, в каком направлении будет произведен сдвиг.
value << bits
value >> bits
Левый аргумент этих операторов - целое число, биты которого сдвинуты. Правый аргумент определяет размер сдвига.
Это показывает, что эта операция, конечно, не коммутативна.
Приоритет этих операторов очень высок. Вы увидите их в обновленной таблице приоритетов, которую мы покажем вам в конце этого раздела.
Посмотрите на сдвиги в окне редактора.
Последний вызов print()
дает следующий результат:
17 68 8
output
Примечание:
17 >> 1
→17 // 2
(17, разделенное на 2 в степени 1) →8
(сдвиг вправо на один бит аналогичен целочисленному делению на два)17 << 2
→17 * 4
(17, умноженное на 2 в степени 2) →68
(сдвиг влево на два бита аналогичен целочисленному умножению на четыре)
А вот и обновленная таблица приоритетов, содержащая все введенные операторы:
Priority | Operator | |
---|---|---|
1 | ~ , + , - |
unary |
2 | ** |
|
3 | * , / , // , % |
|
4 | + , - |
binary |
5 | << , >> |
|
6 | < , <= , > , >= |
|
7 | == , != |
|
8 | & |
|
9 | | |
|
10 | = , += , -= , *= , /= , %= , &= , ^= , |= , >>= , <<= |