Ruby:片段:(num& 1)== 0到底是做什么的?

时间:2010-11-06 20:37:15

标签: ruby bitwise-operators

我正在观看来自PragProg的元编程视频,Dave Thomas展示了这段代码:

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 个答案:

答案 0 :(得分:19)

&是一个按位AND运算符。执行(num & 1)检查是否设置了该数字的最后一位(最低有效位)。如果设置,则数字为奇数,如果未设置,则为偶数。

这是检查数字是偶数还是奇数的快速方法。

您可以在此处查看ruby按位运算符的列表:http://www.techotopia.com/index.php/Ruby_Operators#Ruby_Bitwise_Operators

答案 1 :(得分:19)

这是一个小技巧:具有最小有效位为0的每个二进制数都是偶数和奇数。这是因为2的幂是1,2,4,8,16,...所以会发生的情况是当你用1进行按位AND时,如果最小有效位为0则获得0,否则为1。因此,即使这样做,您也可以轻松识别数字。

当然这只是因为CPU中使用的算法是二进制的,否则它只是废话..

只是一个例子

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

反之亦然

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

答案 2 :(得分:3)

x & y是一个数字,当且仅当i ii时,所有x i位为1 {1}} y的位数为1,否则为0。

由于1是最后一位为1的数字,如果x & 1的最后一位为1,则x为1,否则为0。

由于数字的最后一位如果为奇数则为1,如果为偶数则为0,则检查x&1是否为0等同于检查数字是否为偶数。