【发布时间】:2015-09-21 14:33:31
【问题描述】:
我正在编写代码战 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
测试用例是:
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"
我怀疑失败的测试是负整数,因为第一个失败的测试的预期输出是11111111111111111111110000011000,这意味着正参数值是4294966296,或者是负数。如果我运行to_binary(4294966296),我会得到预期的输出。
【问题讨论】:
-
我假设你想编写算法,即使 ruby 有一个内置的转换 `10.to_s(2) => "1010"'
-
@500_error 除了
(-10).to_s(2) => "-1010" -
@lurker 考虑到负二进制值实际上并不存在,这是一个合理的解释。表示这些的常用符号是Two's Notation,但这并不是唯一的方法。
-
@tadman 当然,但我是说它不能解决 OP 寻找 32 位 2 的补码结果的问题。
-
啊刚看到那部分。通过一些操作来抵消
to_s(2)之前的值,没有什么是您无法解决的。