ruby - 创建一个方法来查找数字是否是 2 的幂?

标签 ruby methods fixnum

如果 num 是 2 的幂,我有这段代码返回 true

def is_power_of_two?(num)
  result = num.inject(0) {|n1, n2| n2 ** n1}
  if result == num
    true
  else
    false
  end
end

p is_power_of_two?(16)

虽然我一直收到错误。我该如何修复和简化这段代码?

最佳答案

显然,n 是一个非负整数。

代码

def po2?(n)
  n.to_s(2).count('1') == 1
end

示例

po2?  0     #=> false
po2?  1     #=> true
po2? 32     #=> true
po2? 33     #=> false

解释

Fixnum#to_s为给定基数提供整数(接收者)的字符串表示。该方法的参数(默认为 10)是基数。例如:

16.to_s     #=> "16" 
16.to_s(8)  #=> "20" 
16.to_s(16) #=> "10"
15.to_s(16) #=>  "f"

我们感兴趣的是以 2 为底。对于 2 的幂:

 1.to_s(2)  #=>      "1" 
 2.to_s(2)  #=>     "10" 
 4.to_s(2)  #=>    "100" 
 8.to_s(2)  #=>   "1000"
16.to_s(2)  #=>  "10000"

对于一些不是2的幂的自然数:

 3.to_s(2)  #=>    "11" 
 5.to_s(2)  #=>   "101" 
11.to_s(2)  #=>  "1011" 

因此,我们希望匹配包含一个 1 的二进制字符串。

另一种方式

R = /
    \A      # match beginning of string ("anchor")
    10*     # match 1 followed by zero or more zeroes
    \z      # match end of string ("anchor")
    /x      # free-spacing regex definition mode

def po2?(n)
  (n.to_s(2) =~ R) ? true : false
end

po2?(4)  #=> true
po2?(5)  #=> false

还有一条路

这使用 Fixnum#bit_lengthFixnum#[] :

def po2?(n)
  m = n.bit_length-1
  n[m] == 1 and m.times.all? { |i| n[i].zero? }
end

po2?  0     #=> false
po2?  1     #=> true
po2? 32     #=> true
po2? 33     #=> false

关于ruby - 创建一个方法来查找数字是否是 2 的幂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31574184/

相关文章:

java - 当我们不传递任何命令行参数时,为什么不会出现错误?

java - 另一个类中的 SQL 更新

ruby - 在 ruby​​ 数组中查找整数 (Fixnum) 值

ruby - NoMethodError:8 的未定义方法 `type':Fixnum

ruby-on-rails - FactoryGirl - 无法写入未知属性和未定义方法 `name'

java - 改变数组的格式

ruby - 在 Ruby 中初始化对象时如何设置属性值?

ruby - 为什么我可以调用.between? Fixnum 上的方法?

ruby - 在不同环境中运行 Cucumber 测试

ruby-on-rails - Windows安装rmagick错误