在Ruby中以二进制描述整数计算前导

时间:2016-09-04 19:53:01

标签: ruby binary bits

我正在寻找快速功能(没有字符串)

leading_ones(0b11101)      # =>3
leading_ones(0b1111000110) # =>4

感谢您的努力!

4 个答案:

答案 0 :(得分:2)

def leading_ones(n)
  nbr = 0
  (n.bit_length-1).downto(0) do |i|
    return nbr if n[i].zero?
    nbr += 1
  end
  nbr
end

leading_ones(6)
  #=> 2

注意6.to_s(2) #=> "110"。这使用方法Fixnum#bit_lengthFixnum#[]

答案 1 :(得分:1)

这可能不是最有效的解决方案,但它确实有效。

def leading_ones(num)
  counter = 0
  while num > 0
    if num % 2 == 0
      counter = 0
    else
      counter += 1
    end

    num = num / 2
  end
  counter
end

leading_ones(0b111) # => 3
leading_ones(0b11101) # => 3
leading_ones(0b111101) # => 4
leading_ones(0b1000) # => 1
leading_ones(0b01000) # => 1

答案 2 :(得分:1)

带循环的版本实际上要快一点,但是FWIW,这里是没有循环的版本:

def leading_ones(n)
    # Number of bits needed to hold `n` as an unsigned integer
    bits = n.bit_length
    # `digits` bits, all on
    max_possible = (1 << bits) - 1
    # Flips all of `n`'s bits
    flipped = n ^ max_possible
    # First right-index of a zero in `n`, or the first index of a 1 in `flipped`
    first_zero_rindex = flipped.bit_length
    # Left-index of the first zero
    first_zero_index = bits - first_zero_rindex
    first_zero_index
end

答案 3 :(得分:0)

到目前为止,这是我的方法:

def leading_ones(arg)
    c=0
    log=Math.log2(arg).to_i
    max_index.downto(0){|i|
        if arg[i]==1
            c+=1
        else
            return c
        end
    }
    return c
end

没有循环的任何想法?我认为应该可以在没有迭代的情况下从另一个计算一个数字。

<强>加入:

好的,它已经很快了,我想我会采取这个解决方案。但另一个没有循环的人将是完美的: - )

欢迎提示!

<强>加入:

不要使用我的方法。它会产生舍入错误。请参阅所选答案以获取正确的版本。