Что значит и означает в python

Привет, я натолкнулся на следующий код

numdigits = len(cardNumber)
oddeven = numdigits & 1

что именно здесь происходит? Я не уверен, что делает "&".

Ответ 1

Ответ

Символ & является побитовым оператором И. Используется с 1, он в основном маскирует значение для извлечения младшего бита или, другими словами, скажет вам, является ли значение четным или нечетным.

Дополнительная информация о Python & operator

Для получения дополнительной информации см.: http://wiki.python.org/moin/BitwiseOperators

Почему это работает, чтобы проверить Odd vs. Even

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()...

Ответ 3

& является поразрядным и, что является эффективным способом выполнения вычислений на уровне бит. Он принимает numdigits и numdigits его с 1, по-бит.

Ответ 4

Это побитовая операция, в этом случае назначение нуля в oddeven если cardNumber имеет четное количество элементов (и одно другое).

В качестве примера: предположим len(cardNumber) == 235. Затем numdigits == 235, который равен 0b11101011 в двоичном формате. Теперь 1 является '0b00000001' в двоичном формате, а когда вы "И", побитовое, вы получите:

  11101011
  &
  00000001
  ----------
= 00000001

Аналогично, если numdigits были 234, вы получите:

  11101010
  &
  00000001
  ----------
= 00000000

Таким образом, это в основном запутанный способ проверки, если len(cardNumber) % 2. Вероятно, написанный кем-то с фоном C, потому что он не очень pythonic-читаемость считается!