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

age*_*217 12 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
Run Code Online (Sandbox Code Playgroud)

现在我明白了这里发生了什么,但我不知道类方法(num & 1)部分究竟发生了什么Math.is_even?.我知道这是一个按位操作,但这是关于它.有人可以向我解释这行代码的用途吗?谢谢.

Ala*_*nse 20

&是一个按位AND运算符.否则(num & 1),如果号码的最后一位(最低显著位)设置检查.如果设置,则数字为奇数,如果未设置,则为偶数.

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

你可以在这里看到一个ruby位运算符列表:http://www.techotopia.com/index.php/Ruby_Operators#Ruby_Bitwise_Operators


Jac*_*ack 19

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

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

只是一个例子

161 = 10100001 &
1   = 00000001
--------------
      00000001 -> odd
Run Code Online (Sandbox Code Playgroud)

反之亦然

84  = 01010100 &
1   = 00000001 
--------------
      00000000 -> even
Run Code Online (Sandbox Code Playgroud)