在Ruby中将整数转换为二进制

Rya*_*ase 2 ruby binary integer

我正在开发一个代码卡kata并且遇到了2个失败的测试用例.

kata描述是:将整数转换为二进制就像那样简单.您将获得一个整数作为参数,您必须返回其二进制形式.要了解如何将十进制数转换为二进制数,请访问此处.

注:负数应作为二进制补码处理; 假设所有数字都是使用任何语言的4个字节(或32位)存储的整数.

我的代码:

def to_binary(n)
  temp_array = []
  if n == 0
    temp_array << 0
  elsif n < 0
    n = n % 256
    while n > 0 do
      temp_array << (n % 2)
      n = (n / 2)
    end
    while temp_array.length < 32 do
      temp_array << 1
    end
  else
    while n > 0 do
      temp_array << (n % 2)
      n = (n / 2)
    end
  end
  binary = temp_array.reverse.join
end
Run Code Online (Sandbox Code Playgroud)

测试用例是:

Test Passed: Value == "10"
Test Passed: Value == "11"
Test Passed: Value == "100"
Test Passed: Value == "101"
Test Passed: Value == "111"
Test Passed: Value == "1010"
Test Passed: Value == "11111111111111111111111111111101"
Test Passed: Value == "0"
Test Passed: Value == "1111101000"
Test Passed: Value == "11111111111111111111111111110001"
Expected: "11111111111111111111110000011000", instead got: "11111111111111111111111111111000"
Expected: "11111111111100001011110111000001", instead got: "11111111111111111111111111000001"
Test Passed: Value == "11110100001000111111"
Run Code Online (Sandbox Code Playgroud)

我怀疑失败的测试是否为负整数,因为第一个失败测试的预期输出11111111111111111111110000011000意味着正参数值为4294966296负或者为负.如果我跑,to_binary(4294966296)我得到预期的输出.

lur*_*ker 7

我不喜欢这种方法,因为我确信有一种更加聪明和/或紧凑的Ruby式方法来实现它.但是使用您将二进制数字加载到数组中然后加入的方法,您可以以更直接的方式完成所需的操作:

def to_binary(n)
  return "0" if n == 0

  r = []

  32.times do
    if (n & (1 << 31)) != 0
      r << 1
    else
      (r << 0) if r.size > 0
    end
    n <<= 1
  end

  r.join
end
Run Code Online (Sandbox Code Playgroud)

或者,使用@ 500_error的建议:

def to_binary(n)
  if n >= 0
    n.to_s(2)
  else
    31.downto(0).map { |b| n[b] }.join
  end
end
Run Code Online (Sandbox Code Playgroud)

然而,处理消极与非消极的不对称性有点令人讨厌.你可以这样做:

def to_binary(n)
  31.downto(0).map { |b| n[b] }.join.sub(/^0*/, "")
end
Run Code Online (Sandbox Code Playgroud)