2010-11-06 24 views
8

estaba viendo un vídeo de metaprogramming PragProg, y Dave Thomas mostraron este fragmento de código:Ruby: ¿Qué significa el fragmento: (num & 1) == 0 exactamente hacer?

module Math 
    class << self 
    def is_even?(num) 
     (num & 1) == 0 # What exactly is going on here? Particularly (num & 1) 
    end 
    end 
end 

puts Math.is_even? 1 # => false 
puts Math.is_even? 2 # => true 

Ahora entiendo lo que está pasando aquí, pero no sé qué es exactamente lo que está sucediendo con la parte (num & 1) del método de clase Math.is_even?. Sé que es una operación de bit a bit pero eso es todo. ¿Puede alguien explicarme qué sucede con esa línea de código? Gracias.

Respuesta

13

& es un operador AND. Al hacer (num & 1) se comprueba si se ha configurado el último bit (el menos significativo) del número. Si está configurado, el número es impar, y si no está configurado, es par.

Es sólo una forma rápida de comprobar si un número es par o impar.

se puede ver una lista de los operadores de bits rubí aquí: http://www.techotopia.com/index.php/Ruby_Operators#Ruby_Bitwise_Operators

18

Es un pequeño truco: cada número binario que tiene el bit menos significativo es 0 a pares e impares de otra manera. Esto debido a que las potencias de dos son 1,2,4,8,16,... así que lo que sucede es que cuando se hace AND bit a bit con 1 a obtener 0 si el bit menos significativo de 0 y 1 en caso contrario. Entonces usted puede reconocer fácilmente si un número es incluso al hacerlo.

Por supuesto, esto funciona sólo porque la aritmética usada en las CPUs es binaria, de lo contrario sería simplemente basura ..

sólo un ejemplo

161 = 10100001 & 
1 = 00000001 
-------------- 
     00000001 -> odd 

viceversa

84 = 01010100 & 
1 = 00000001 
-------------- 
     00000000 -> even 
3

x & y es donde un número para toda la ii ésimo bit es 1 si y sólo si el i ésimo bit de x y la i ésimo bit de y son 1 y 0 en caso contrario.

Dado que 1 es el número donde solo el último bit es 1, x & 1 es 1 si el último bit de x es 1 y 0 en caso contrario.

Dado que el último bit de un número es 1 si es impar y 0 si es par, comprobar si x&1 es 0 es equivalente a verificar si un número es par.

Cuestiones relacionadas