Hola me encontré con el siguiente código
numdigits = len(cardNumber) oddeven = numdigits & 1
¿Qué está pasando aquí? No estoy seguro de lo que está haciendo el “&”.
El símbolo &
es un operador AND a nivel de bit. Usado con 1, básicamente enmascara el valor para extraer el bit más bajo, o en otras palabras le dirá si el valor es par o impar.
&
operator Para obtener más información, consulte: http://wiki.python.org/moin/BitwiseOperators
EDITAR: Agregar esta sección ya que esta respuesta está recibiendo un poco de amor
La razón por la que ANDing un valor con 1 indica si el valor es impar o incluso puede no ser obvio al principio.
La representación binaria de un número es esencialmente la sum de una serie de SÍ o NO para cada potencia de 2 moviéndose hacia la izquierda en el dígito más a la derecha con 1, 2, 4, 8, …
Sólo hay una manera de representar cualquier número de esta manera. Por ejemplo, el número 13 (base 10) se puede escribir en binario como “1101” (o hexadecimal como 0xD, pero eso no es el punto). Mira aquí:
1 1 0 1 xxxx 8 4 2 1 = = = = 8 + 4 + 0 + 1 = 13
Observe que, aparte del dígito binario más a la derecha, todos los otros 1
dígitos agregarán un número par (es decir, un múltiplo de 2) a la sum. Entonces, la única manera de obtener una sum final impar es sumr ese 1 impar del dígito más a la derecha. Entonces, si tenemos curiosidad si un número es impar o par, podemos observar su representación binaria e ignorar todo excepto el dígito más a la derecha.
Para ello, utilizamos el operador bitwise AND. El valor 1
en binario se expresa como 1
:
0 0 0 1 xxxx 8 4 2 1 = = = = 0 + 0 + 0 + 1 = 1
ANDAR un valor con 1
como este dará como resultado 1
si se establece el bit más a la derecha del valor, y 0
si no lo está.
Y como 0
general se considera “falso” en la mayoría de los idiomas, y los valores que no son cero se consideran “verdaderos”, podemos decir simplemente como un atajo:
if (value & 1): do_something_with_odd_value()...
Además, &
también se usa para tomar la intersección de dos conjuntos de Python :
set1 = {0,1,2,3} set2 = {2,3,4,5} print(set1 & set2) >>>set([2, 3])
Es una operación a nivel de bits, en este caso, se asigna cero a un oddeven
si cardNumber
tiene un número par de elementos (y uno de otro modo).
Como ejemplo: supongamos que len(cardNumber) == 235
. Luego numdigits == 235
, que es 0b11101011
en binario. Ahora 1
es '0b00000001'
en binario, y cuando los '0b00000001'
“, a nivel de bits, obtendrás:
11101011 & 00000001 ---------- = 00000001
De manera similar, si los numdigits
fueran 234, obtendrías:
11101010 & 00000001 ---------- = 00000000
Por lo tanto, es básicamente una forma len(cardNumber) % 2
de comprobar si len(cardNumber) % 2
. Probablemente escrito por alguien con un fondo en C, porque no es muy python – ¡la legibilidad cuenta!
&
es un bit y , que es una forma eficiente de hacer cálculos a nivel de bit. Está tomando numdigits
y, a continuación, con 1
, bit a bit.
Es un operador binario en modo bit y operador .