4

有人可以给出最简单的解决方案,将整数转换为表示其相关二进制数字的整数数组。

Input  => Output
1      => [1]
2      => [2]
3      => [2,1]
4      => [4]
5      => [4,1]
6      => [4,2]

One way is :
Step 1 : 9.to_s(2) #=> "1001"
Step 2 : loop with the count of digit
         use / and % 
         based on loop index, multiply with 2
         store in a array

还有其他直接或更好的解决方案吗?

4

3 回答 3

8

Fixnum 和 Bignum 有一个[]方法,它返回第 n 位的值。有了这个我们可以做到

def binary n
  Math.log2(n).floor.downto(0).select {|i| n[i] == 1 }.collect {|i| 2**i}
end

您可以通过计算 2 的连续幂直到该幂太大来避免调用 Math.log2:

def binary n
  bit = 0
  two_to_the_bit = 1
  result = []
  while two_to_the_bit <= n
    if n[bit] == 1
      result.unshift two_to_the_bit
    end
    two_to_the_bit = two_to_the_bit << 1
    bit += 1
  end
  result
end

更详细,但更快

于 2012-07-09T06:29:36.093 回答
3

这是一个使用 Ruby 1.8 的解决方案。(Math.log2在 Ruby 1.9 中添加):

def binary(n)
  n.to_s(2).reverse.chars.each_with_index.map {|c,i| 2 ** i if c.to_i == 1}.compact
end

在行动:

>>  def binary(n)
>>       n.to_s(2).reverse.chars.each_with_index.map {|c,i| 2 ** i if c.to_i == 1}.compact
>>     end
=> nil
>> binary(19)
=> [1, 2, 16]
>> binary(24)
=> [8, 16]
>> binary(257)
=> [1, 256]
>> binary(1000)
=> [8, 32, 64, 128, 256, 512]
>> binary(1)
=> [1]

.reverse当然,如果您想按降序查看值,请添加 final 。

于 2012-07-09T06:07:30.530 回答
0
class Integer
  def to_bit_array
    Array.new(size) { |index| self[index] }.reverse!
  end

  def bits
    to_bit_array.drop_while &:zero?
  end

  def significant_binary_digits
    bits = self.bits
    bits.each_with_object(bits.count).with_index.map do |(bit, count), index|
      bit * 2 ** (count - index - 1)
    end.delete_if &:zero?
  end
end

改编自并改进comp.lang.ruby.

一些简单的基准测试表明,此解决方案比涉及以2 为底的对数字符串操作的算法更快,并且比直接位操作慢。

于 2012-07-09T10:37:54.803 回答