Module (47%)
Section (50%)

Логические и битовые операции: продолжение

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

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