How to convert a string or integer to binary in Ruby?

后端 未结 8 1359
栀梦
栀梦 2020-11-30 17:22

How do you create integers 0..9 and math operators + - * / in to binary strings. For example:

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

Is the

相关标签:
8条回答
  • 2020-11-30 17:42

    I asked a similar question. Based on @sawa's answer, the most succinct way to represent an integer in a string in binary format is to use the string formatter:

    "%b" % 245
    => "11110101"
    

    You can also choose how long the string representation to be, which might be useful if you want to compare fixed-width binary numbers:

    1.upto(10).each { |n| puts "%04b" % n }
    0001
    0010
    0011
    0100
    0101
    0110
    0111
    1000
    1001
    1010
    
    0 讨论(0)
  • 2020-11-30 17:44

    I am almost a decade late but if someone still come here and want to find the code without using inbuilt function like to_S then I might be helpful.

    find the binary

    def find_binary(number)
      binary = []  
      until(number == 0)
        binary << number%2
        number = number/2
      end
      puts binary.reverse.join
    end
    
    0 讨论(0)
  • 2020-11-30 17:45

    If you're only working with the single digits 0-9, it's likely faster to build a lookup table so you don't have to call the conversion functions every time.

    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"
    

    Indexing into this hash table using either the integer or string representation of a number will yield its binary representation as a string.

    If you require the binary strings to be a certain number of digits long (keep leading zeroes), then change x.to_s(2) to sprintf "%04b", x (where 4 is the minimum number of digits to use).

    0 讨论(0)
  • 2020-11-30 17:45

    In ruby Integer class, to_s is defined to receive non required argument radix called base, pass 2 if you want to receive binary representation of a string.

    Here is a link for an official documentation of String#to_s

      1.upto(10).each { |n|  puts n.to_s(2) }
    
    0 讨论(0)
  • 2020-11-30 17:46

    You would naturally use Integer#to_s(2), String#to_i(2) or "%b" in a real program, but, if you're interested in how the translation works, this method calculates the binary representation of a given integer using basic operators:

    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
    

    To check it works:

    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
    
    0 讨论(0)
  • 2020-11-30 18:00

    If you are looking for a Ruby class/method I used this, and I have also included the tests:

    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
    
    0 讨论(0)
提交回复
热议问题