2015-09-16 2 views
0

Я новичок в Python и не могу это понять. Может кто-то помочь сломать заявление для меня?Понимание побитовых, арифметических и булевых операторов Python

И п и четность представляют собой целые числа

n += parity != n & 1 
+0

Что такое 'n' и' parity', определенные как? –

+0

Можем ли мы получить некоторый контекст для этого кода? Есть ли у вас ощущение того, какие типы переменных n и четность? –

+0

и n и четность являются целыми числами –

ответ

4

Выражение оценивается как n += (parity != (n & 1)), а результаты:

  • n & 1 является битовая маска, это маскирует целые n вниз наименее значимый бит. Если n является нечетным, оно будет 1, если оно четное, этот бит будет 0.

  • parity != 0 или parity != 1 производит логическое результата, True или False, сигнализация, если parity не был равен или 01 справа.

  • Образовавшееся True или False добавляют до n, как если бы вы делали n = n + True или n = n + False. Булевский тип Python является подклассом из int и False имеет целочисленное значение 0 и True значение 1.

код, по существу, является добавление 0 или 1 к n, основываясь на значении parity и если n в настоящее время четным или нечетным.

Короткая демонстрация может проиллюстрировать это лучше.

Во-первых, производство n & 10 или 1:

>>> n = 10 # even 
>>> bin(n) # the binary representation of 10 
'0b1010' 
>>> n & 1 # should be 0, as the last bit is 0 
0 
>>> n = 11 # odd 
>>> bin(n) # the binary representation of 11 
'0b1011' 
>>> n & 1 # should be 1, as the last bit is 1 
1 

Далее, parity != 0 или parity != 1 часть; обратите внимание, что я предполагаю, что parity ограничивается 0 или 1, это действительно не имеет смысла для того, чтобы иметь другие значения:

>>> parity = 0 
>>> parity != 1 
True 
>>> parity != 0 
False 
>>> parity = 1 
>>> parity != 1 
False 
>>> parity != 0 
True 

последнее, что булевы являются целыми числами:

>>> isinstance(True, int) 
True 
>>> int(True) 
1 
>>> 10 + True 
11 
>>> 10 + False 
10 

Формула выглядит как он вычисляет CRC checksum.

0

Позволяет разбить это вниз:

(n += (parity != (n & 1))) 

(n & 1) это битовая, и принимает значение наименьшего (младшего значащего бита) n.

parity != это верно, если parity отличается от результата (n & 1)

n += это приращение n на любое значение, остальная часть строки возвращает.

n parity output(increment of n) 
0  1   1 
1  1   0 
1  0   1 
0  0   0 

Из приведенной выше таблицы видно, что она функционирует как XOR n LSB и четность.

Примечания: Обычно четность - это нечетность (1) или четность (0) пакета данных.

Надеюсь, это поможет! Наслаждаться.

Смежные вопросы