Привет, я натолкнулся на следующий код
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-читаемость считается!