루비에서 문자열이나 정수를 이진수로 변환하는 방법은 무엇입니까?
정수 0..9와 산술 연산자 + - * /를 이진 문자열로 만드는 방법은 무엇입니까?예:
0 = 0000,
1 = 0001,
...
9 = 1001
라이브러리를 사용하지 않고 루비 1.8.6으로 이를 수행할 수 있는 방법이 있습니까?
당신은 가지고 있다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
저도 비슷한 질문을 했습니다.@sawa의 답변에 따르면, 이진 형식으로 문자열에서 정수를 나타내는 가장 간단한 방법은 문자열 포맷터를 사용하는 것입니다.
"%b" % 245
=> "11110101"
고정 너비 이진수를 비교하려는 경우 유용할 수 있는 문자열 표현의 길이를 선택할 수도 있습니다.
1.upto(10).each { |n| puts "%04b" % n }
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
bta의 lookup table 아이디어를 바탕으로 블록으로 lookup table을 만들 수 있습니다.값은 나중을 위해 처음 액세스하고 저장할 때 생성됩니다.
>> 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"}
당신은 자연스럽게 사용할 것입니다.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
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
는 사용할 최소 자릿수입니다.
루비 정수 클래스에서 to_s는 다음과 같이 호출되는 불필요한 인수 기수를 수신하도록 정의됩니다.base
문자열의 이진 표현을 수신하려면 2를 통과합니다.
String#to_s의 공식 문서 링크입니다.
1.upto(10).each { |n| puts n.to_s(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
거의 10년 가까이 늦었지만 누군가가 여전히 여기에 와서 to_S와 같은 내장 함수를 사용하지 않고 코드를 찾고 싶다면 도움이 될 수 있습니다.
이진수를 구합니다.
def find_binary(number)
binary = []
until(number == 0)
binary << number%2
number = number/2
end
puts binary.reverse.join
end
언급URL : https://stackoverflow.com/questions/2339695/how-to-convert-a-string-or-integer-to-binary-in-ruby
'programing' 카테고리의 다른 글
유닉스 타임스탬프(에포크 이후 초)를 루비 날짜 시간으로 변환하는 방법은 무엇입니까? (0) | 2023.06.02 |
---|---|
개체를 해시로 루비 변환 (0) | 2023.06.02 |
SSL 인증서를 신뢰할 수 없음 - 모바일에서만 (0) | 2023.06.02 |
레일:포함 대 :조인트 (0) | 2023.06.02 |
파일 및 폴더를 포함하여 커밋되지 않은 변경 사항을 되돌리는 방법은 무엇입니까? (0) | 2023.06.02 |