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)我得到预期的输出.
我不喜欢这种方法,因为我确信有一种更加聪明和/或紧凑的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)