如何在 Ruby 中将字符串或整数转换为二进制?

如何将整数0.9和数学运算符 +-*/in 创建为二进制字符串。 例如:

 0 = 0000,
1 = 0001,
...
9 = 1001

对于 Ruby1.8.6,有没有不使用库的方法?

147457 次浏览

您可以使用 Integer#to_s(base)String#to_i(base)

Integer#to_s(base)将十进制数转换为一个字符串,该字符串表示指定基数中的数字:

9.to_s(2) #=> "1001"

String#to_i(base)则获得相反的结果:

"1001".to_i(2) #=> 9

如果您只使用单位数字0-9,那么构建一个查找表可能会更快,这样您就不必每次都调用转换函数。

lookup_table = Hash.new
(0..9).each {|x|
lookup_table[x] = x.to_s(2)
lookup_table[x.to_s] = x.to_s(2)
}
lookup_table[5]
=> "101"
lookup_table["8"]
=> "1000"

使用数字的整数或字符串表示形式索引到这个哈希表将生成其二进制表示形式的字符串。

如果您要求二进制字符串的长度为一定数量的数字(保持前导零) ,那么将 x.to_s(2)改为 sprintf "%04b", x(其中 4是要使用的最小数字数)。

采用 bta 的查找表思想,您可以创建带块的查找表。值是在首次访问并存储时生成的,以备以后使用:

>> lookup_table = Hash.new { |h, i| h[i] = i.to_s(2) }
=> {}
>> lookup_table[1]
=> "1"
>> lookup_table[2]
=> "10"
>> lookup_table[20]
=> "10100"
>> lookup_table[200]
=> "11001000"
>> lookup_table
=> {1=>"1", 200=>"11001000", 2=>"10", 20=>"10100"}

如果你正在寻找一个 Ruby 类/方法,我使用了这个,我也包含了测试:

class Binary
def self.binary_to_decimal(binary)
binary_array = binary.to_s.chars.map(&:to_i)
total = 0


binary_array.each_with_index do |n, i|
total += 2 ** (binary_array.length-i-1) * n
end
total
end
end


class BinaryTest < Test::Unit::TestCase
def test_1
test1 = Binary.binary_to_decimal(0001)
assert_equal 1, test1
end


def test_8
test8 = Binary.binary_to_decimal(1000)
assert_equal 8, test8
end


def test_15
test15 = Binary.binary_to_decimal(1111)
assert_equal 15, test15
end


def test_12341
test12341 = Binary.binary_to_decimal(11000000110101)
assert_equal 12341, test12341
end
end

在实际的程序中,你自然会使用 Integer#to_s(2)String#to_i(2)"%b",但是,如果你对转换的工作原理感兴趣,这个方法会使用基本的运算符来计算给定整数的二进制表示:

def int_to_binary(x)
p = 0
two_p = 0
output = ""


while two_p * 2 <= x do
two_p = 2 ** p
output << ((two_p & x == two_p) ? "1" : "0")
p += 1
end


#Reverse output to match the endianness of %b
output.reverse
end

检查它的工作原理:

1.upto(1000) do |n|
built_in, custom = ("%b" % n), int_to_binary(n)
if built_in != custom
puts "I expected #{built_in} but got #{custom}!"
exit 1
end
puts custom
end

我问了 一个类似的问题。根据 @ sawa的答案,以二进制格式表示字符串中的整数的最简洁的方法是使用字符串格式化程序:

"%b" % 245
=> "11110101"

您还可以选择字符串表示形式的长度,如果您想比较固定宽度的二进制数,这可能会很有用:

1.upto(10).each { |n| puts "%04b" % n }
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010

我差不多晚了十年,但是如果有人仍然来到这里,想要找到代码而不使用内置函数像 _ S,那么我可能会有帮助。

找到二进制

def find_binary(number)
binary = []
until(number == 0)
binary << number%2
number = number/2
end
puts binary.reverse.join
end

在 ruby Integer 类中,to _ s 被定义为接收称为 base的非必需参数基数,如果您希望接收字符串的二进制表示形式,则传递2。

下面是 < a href = “ https://ruby-doc.org/core-2.5.0/Integer.html # method-i-to _ s”rel = “ nofollow norefrer”> String # to _ s 的官方文档链接

  1.upto(10).each { |n|  puts n.to_s(2) }