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

mcm*_*ney 161 ruby binary encode

如何创建整数0..9和数学运算符+ - */in到二进制字符串.例如:

 0 = 0000,
 1 = 0001, 
 ...
 9 = 1001
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用库的情况下使用Ruby 1.8.6执行此操作?

Mik*_*use 359

你有Integer#to_s(base)并且String#to_i(base)可以使用.

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

9.to_s(2) #=> "1001"
Run Code Online (Sandbox Code Playgroud)

而反向是通过以下方式获得的String#to_i(base):

"1001".to_i(2) #=> 9
Run Code Online (Sandbox Code Playgroud)

  • @TomRavenscroft此外,您可以使用`("%08b"%int)`或`("%08b"%string)`来返回固定数量的位. (22认同)
  • `-9.to_s(2)``=>"-1001"`有人能解释一下吗? (4认同)
  • 这挽救了我的一天! (2认同)

Ale*_*pov 41

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

"%b" % 245
=> "11110101"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我做了一些本地测试,将整数转换为二进制字符串,但结果显示像`245.to_s(2)`这样的代码比`'%b"%245更快. (6认同)

Mic*_*ohl 20

了解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"}
Run Code Online (Sandbox Code Playgroud)


joe*_*ews 11

你会自然地使用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
Run Code Online (Sandbox Code Playgroud)

要检查它的工作原理:

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
Run Code Online (Sandbox Code Playgroud)