Ruby에서 문자열 또는 정수를 이진으로 변환하는 방법은 무엇입니까?


168

이진 문자열에 정수 0..9 및 수학 연산자 +-* / in을 어떻게 작성합니까? 예를 들면 다음과 같습니다.

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

라이브러리를 사용하지 않고 Ruby 1.8.6으로 이것을 수행하는 방법이 있습니까?


수학 연산자를 이진 문자열로 변환 할 때 정확히 무엇을 의미합니까? 바이너리로 작성된 ASCII 표현을 사용 하시겠습니까?
bta

나는 인기있는 유전자 알고리즘을하고 싶었던 것 같아? :-)
nemesisfixx 2014 년

답변:


372

당신은 당신에게 Integer#to_s(base)있고 String#to_i(base)가능합니다.

Integer#to_s(base) 10 진수를 지정된 밑의 숫자를 나타내는 문자열로 변환합니다.

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

반대로는 다음과 String#to_i(base)같이 얻습니다 .

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

24
@TomRavenscroft 또한 ("%08b" % int)또는 ("%08b" % string)고정 된 수의 비트를 사용 하거나 반환 할 수 있습니다 .
부패

1
화려한 마이크, 화려한 루비!
Tamer Shlash가 15:14

4
-9.to_s(2) => "-1001"누군가 이것을 설명 할 수 있습니까?
user1201917

1
나처럼 @decay
Taylor Liss

그게 무슨 문제 야? 9이다 1001진.
preferred_anon

41

나는 비슷한 질문을했다 . @sawa 의 답변을 바탕으로 문자열에서 정수를 이진 형식으로 나타내는 가장 간결한 방법은 문자열 포맷터를 사용하는 것입니다.

"%b" % 245
=> "11110101"

문자열 표현의 길이를 선택할 수도 있습니다. 이는 고정 너비 이진수를 비교하려는 경우 유용 할 수 있습니다.

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

6
정수를 이진 문자열로 변환하기 위해 로컬 테스트를 수행했지만 결과는 다음과 같은 코드 245.to_s(2)가 더 빠를 것입니다."%b" % 245
Green Su

또한 음수 값에는 제대로 작동하지 않습니다.
alex

21

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"}

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

작동하는지 확인하려면 다음을 수행하십시오.

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

4

단일 숫자 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"

숫자의 정수 또는 문자열 표현을 사용하여이 해시 테이블에 색인을 생성하면 이진 표현이 문자열로 생성됩니다.

이진 문자열이 특정 자릿수 길이 여야하는 경우 (앞의 0을 유지)로 변경 x.to_s(2)하십시오 sprintf "%04b", x( 4사용할 최소 자릿수는 어디 입니까).


@ bta-이 모든 문자를 이진으로 인코딩하여 유전자 알고리즘에 사용할 수 있습니다. 세트가 0..9 및 +-* /로 제한되어 있기 때문에 인코딩 / 디코딩에 대한 룩업 테이블의 아이디어가 정말 마음에
듭니다.

2

루비 클래스 / 메소드를 찾고 있다면 이것을 사용했으며 테스트도 포함했습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.