Логические и битовые операции: продолжение
Теперь мы покажем вам пример разницы в работе логических и битовых операций. Предположим, что были выполнены следующие задания:
i = 15
j = 22
Если мы предположим, что целые числа хранятся на 32 битах, побитовое изображение двух переменных будет следующим:
i: 00000000000000000000000000001111
j: 00000000000000000000000000010110
Дано задание:
log = i and j
Здесь мы имеем дело с логической конъюнкцией. Проследим ход расчетов. Обе переменные i
и j
не являются нулями, поэтому будут считаться представляющими True
. Просматривая таблицу истинности для оператора and
, мы видим, что результатом будет True
. Никаких других операций не производится.
log: True
Теперь побитовая операция - вот она:
bit = i & j
Оператор &
будет работать с каждой парой соответствующих битов отдельно, считая значения соответствующих битов результата. Следовательно, результат будет таким:
i |
00000000000000000000000000001111 |
j |
00000000000000000000000000010110 |
bit = i & j |
00000000000000000000000000000110 |
Эти биты соответствуют целочисленному значению шести.
Теперь посмотрим на операторы отрицания. Сначала логический:
logneg = not i
Значение переменной logneg
будет установлено на False
- больше ничего делать не нужно.
Побитовое отрицание выглядит так:
bitneg = ~i
Это может быть немного удивительно: значение переменной bitneg
равно -16
. Это может показаться странным, но это совсем не так. Если вы хотите узнать больше, Вам следует изучить двоичную систему счисления и правила, регулирующие числа с дополнением до двух.
i |
00000000000000000000000000001111 |
bitneg = ~i |
11111111111111111111111111110000 |
Каждый из этих операторов с двумя аргументами можно использовать в сокращенной форме. Вот примеры их эквивалентных обозначений:
x = x & y |
x &= y |
x = x | y |
x |= y |
x = x ^ y |
x ^= y |