Module (49%)
Section (83%)

Бинарный сдвиг влево и бинарный сдвиг вправо

Python предлагает еще одну операцию, связанную с отдельными битами: сдвиг. Это применяется только к целым значениям, и Вы не должны использовать для него числа с плавающей запятой в качестве аргумента.

Вы уже применяете эту операцию очень часто и совершенно бессознательно. Как умножить любое число на десять? Посмотрите:

12345 × 10 = 123450


Как видите, умножение на десять - это фактически сдвиг всех цифр влево и заполнение полученного пробела нулем.

Деление на десять? Посмотрите:

12340 ÷ 10 = 1234


Деление на десять - это не что иное, как сдвиг цифр вправо.


Компьютер выполняет такую же операцию, но с одним отличием: поскольку два - это основание для двоичных чисел (не 10), сдвиг значения на один бит влево, таким образом, соответствует его умножению на два; соответственно, сдвиг на один бит вправо аналогичен делению на два (обратите внимание, что самый правый бит теряется).

Операторы сдвига в Python представляют собой пару диграфов: << и >>, ясно говорящих, в каком направлении будет произведен сдвиг.

value << bits value >> bits

Левый аргумент этих операторов - целое число, биты которого сдвинуты. Правый аргумент определяет размер сдвига.

Это показывает, что эта операция, конечно, не коммутативна.

Приоритет этих операторов очень высок. Вы увидите их в обновленной таблице приоритетов, которую мы покажем вам в конце этого раздела.


Посмотрите на сдвиги в окне редактора.

Последний вызов print() дает следующий результат:

17 68 8

output

Примечание:

  • 17 >> 117 // 2 (17, разделенное на 2 в степени 1) → 8 (сдвиг вправо на один бит аналогичен целочисленному делению на два)
  • 17 << 217 * 4 (17, умноженное на 2 в степени 2) → 68 (сдвиг влево на два бита аналогичен целочисленному умножению на четыре)


А вот и обновленная таблица приоритетов, содержащая все введенные операторы:

Priority Operator
1 ~, +, - unary
2 **
3 *, /, //, %
4 +, - binary
5 <<, >>
6 <, <=, >, >=
7 ==, !=
8 &
9 |
10 =, +=, -=, *=, /=, %=, &=, ^=, |=, >>=, <<=

Code

var = 17
var_right = var >> 1
var_left = var << 2
print(var, var_left, var_right)
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×