Ruby: Что именно делает фрагмент: (num & 1) == 0? - PullRequest
12 голосов
/ 06 ноября 2010

Я смотрел видео метапрограммирования от PragProg, и Дейв Томас показал этот фрагмент кода:

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

Теперь я понимаю, что здесь происходит, но я не знаю, что именно происходит с(num & 1) часть метода класса Math.is_even?.Я знаю, что это побитовая операция, но это все.Может кто-нибудь объяснить мне, что происходит с этой строкой кода?Спасибо.

Ответы [ 3 ]

20 голосов
/ 06 ноября 2010

& является побитовым оператором AND.Выполнение (num & 1) проверяет, установлен ли последний бит (младший значащий бит) числа.Если оно установлено, число нечетное, а если оно не установлено, оно четное.

Это простой способ проверить, является ли число четным или нечетным.

Высписок побитовых операторов ruby ​​можно посмотреть здесь: http://www.techotopia.com/index.php/Ruby_Operators#Ruby_Bitwise_Operators

19 голосов
/ 06 ноября 2010

Это небольшая хитрость: каждое двоичное число, у которого младший значащий бит равен 0, является четным и нечетным в противном случае. Это потому, что степени двух равны 1,2,4,8,16,..., поэтому происходит то, что когда вы выполняете битовую операцию И с 1, вы получаете 0, если младший значащий бит был 0 и 1 в противном случае. Таким образом, вы можете легко распознать число, если даже сделав это.

Конечно, это работает только потому, что арифметика, используемая в процессорах, является двоичной, иначе это будет просто дерьмо.

просто пример

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

ViceVersa

84  = 01010100 &
1   = 00000001 
--------------
      00000000 -> even
3 голосов
/ 06 ноября 2010

x & y - это число, где для всех i i -й бит равен 1 тогда и только тогда, когда i-й бит x и i-й бит y равны 1и 0 в противном случае.

Поскольку 1 - это число, в котором только последний бит равен 1, x & 1 равно 1, если последний бит x равен 1, и 0 в противном случае.

Поскольку последний бит числа равен 1, если он нечетный, и 0, если он четный, проверка, равняется ли x&1 0, эквивалентна проверке, является ли число четным.

...