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

Converting Integers to Binary in Ruby

我正在研究代码战争套路,遇到了 2 个失败的测试用例。

套路说明是: 就这么简单地将整数转换为二进制。你会得到一个整数作为参数,你必须 return 它的二进制形式。要了解如何将十进制数转换为二进制数,请访问此处。

注意:负数按补码处理;假设所有数字都是以任何语言使用 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) 我得到预期的输出。

我不喜欢这种方法,因为我确信还有一种更聪明的 and/or 紧凑的 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

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

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

不过,处理消极与非消极的不对称有点烦人。你可以这样做:

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

这不是生成 2 的补码的传统算法,因此我不确定它是否有助于您理解二进制转换,但您可以在 ruby 中这样做以帮助检查您的答案。

注意:这仅适用于负数。

32.downto(0).map { |n| -4294966296[n] }.join
=> "100000000000000000000001111101000"

对于 2 的补码计算,最好使用 C 等低级语言来实现,以了解算法。聪明的方法掩盖了步骤,只给你一个答案。

假设我们正在处理 8 位(为简单起见),并假设我们想知道 -28 是如何用二进制补码表示的。

  1. 首先我们以二进制形式写出28。 00011100

  2. 然后我们反转数字。 0变成1,1变成0。 11100011

  3. 然后我们加1。 11100100