Привет, я натолкнулся на следующий код
numdigits = len(cardNumber)
oddeven = numdigits & 1
что именно здесь происходит? Я не уверен, что делает "&".
Привет, я натолкнулся на следующий код
numdigits = len(cardNumber)
oddeven = numdigits & 1
что именно здесь происходит? Я не уверен, что делает "&".
Символ &
является побитовым оператором И. Используется с 1, он в основном маскирует значение для извлечения младшего бита или, другими словами, скажет вам, является ли значение четным или нечетным.
&
operatorДля получения дополнительной информации см.: http://wiki.python.org/moin/BitwiseOperators
EDIT: добавление этого раздела, так как этот ответ получает некоторую любовь
Причина, по которой ANDing значение с 1 указывает, является ли значение нечетным или даже может быть не очевидным вначале.
Бинарное представление числа - это, по сути, сумма серии YES или NO для каждой мощности 2, перемещающейся влево, начиная с самой правой цифры с 1, 2, 4, 8,...
Существует только один способ представить любое число таким образом. Например, число 13 (база 10) может быть записано в двоичном виде как "1101" (или шестнадцатеричное, как 0xD, но это рядом с точкой). Глянь сюда:
1 1 0 1
x x x x
8 4 2 1
= = = =
8 + 4 + 0 + 1 = 13
Обратите внимание, что кроме самой правой двоичной цифры все остальные 1
цифры добавят четное число (т.е. Кратное 2) к сумме. Таким образом, единственный способ получить нечетную конечную сумму - добавить этот нечетный 1 из самой правой цифры. Поэтому, если нам интересно, если число нечетное или четное, мы можем посмотреть его двоичное представление и игнорировать все, кроме самой правой цифры.
Для этого мы используем побитовый оператор И. Значение 1
в двоичном выражении выражается как 1
:
0 0 0 1
x x x x
8 4 2 1
= = = =
0 + 0 + 0 + 1 = 1
Инициализация значения с 1
как это, приведет к 1
если значение самого правого бита установлено, и 0
если это не так.
И поскольку 0
обычно считается "ложным" в большинстве языков, а ненулевые значения считаются "истинными", мы можем просто сказать как ярлык:
if (value & 1): do_something_with_odd_value()...
Кроме того, &
также используется для пересечения двух наборов Python:
set1 = {0,1,2,3}
set2 = {2,3,4,5}
print(set1 & set2)
>>>set([2, 3])
&
является поразрядным и, что является эффективным способом выполнения вычислений на уровне бит. Он принимает numdigits
и numdigits
его с 1
, по-бит.
Это побитовая операция, в этом случае назначение нуля в oddeven
если cardNumber
имеет четное количество элементов (и одно другое).
В качестве примера: предположим len(cardNumber) == 235
. Затем numdigits == 235
, который равен 0b11101011
в двоичном формате. Теперь 1
является '0b00000001'
в двоичном формате, а когда вы "И", побитовое, вы получите:
11101011
&
00000001
----------
= 00000001
Аналогично, если numdigits
были 234, вы получите:
11101010
&
00000001
----------
= 00000000
Таким образом, это в основном запутанный способ проверки, если len(cardNumber) % 2
. Вероятно, написанный кем-то с фоном C, потому что он не очень pythonic-читаемость считается!