Je regardais une vidéo de MetaProgramming de PragProg, et Dave Thomas a montré cet extrait de code:
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
3 Réponses :
C'est juste un moyen rapide de vérifier si un numéro est pair ou impair. p>
Vous pouvez voir une liste des opérateurs de bits de rubis ici: http: // www. techotopia.com/index.php/ruby_opérators#ruby_bitwise_opérators p> & code> est un bitwise et opérateur. Faire
(num & 1) code> vérifie si le dernier bit (le moins significatif) du numéro est défini. S'il est défini, le nombre est impair et s'il n'est pas défini, c'est même. P>
C'est un peu d'astuce: chaque chiffre binaire qui a le moins significatif à 0 est même et impair sinon. Ceci parce que les pouvoirs de deux sont Bien sûr, cela fonctionne simplement parce que l'arithmétique utilisé dans les processeurs est binaire, sinon ce serait juste la merde .. p> juste un exemple < / p> vicefersa p> 1,2,4,8,16, ... code>, alors que se passe-t-il, c'est que lorsque vous faites un peu et avec 1, vous obtenez 0 si le bit le moins significatif était 0 et 1 sinon. Donc, vous pouvez facilement reconnaître si un numéro si même en le faisant.
Etant donné que Étant donné que le dernier bit d'un numéro est 1 si c'est impair et 0 s'il est même, vérifiez si x & y code> est un numéro où pour tous les
i code> i code> i code> th bit est 1 si et seulement si le
i < / Code> Th Bit of
X code> et le
i code> ort bit de
y code> sont 1 et 0 sinon. p>
1 code> est le numéro où seul le bit est 1,
x & 1 code> est 1 si le dernier bit de
x code> est 1 et 0 sinon. p>
x & 1 code> est égal à la vérification si un nombre est même. P>