@TomRavenscroft Ponadto możesz użyć ("%08b" % int)lub, ("%08b" % string)aby zwrócić stałą liczbę bitów.
rozpad
1
Genialny Mike, genialny Ruby!
Tamer Shlash
4
-9.to_s(2)=> "-1001"Czy ktoś może to wyjaśnić?
user1201917
1
Dla tych, którzy są zdezorientowani kodem @ decay, takim jak ja, używa ``
Taylor Liss
@ user1201917 Co w tym złego? 9jest 1001binarny.
preferred_anon
41
Zadałem podobne pytanie . Opierając się na odpowiedzi @sawa , najbardziej zwięzłym sposobem przedstawienia liczby całkowitej w ciągu w formacie binarnym jest użycie programu formatującego ciąg:
"%b"%245=>"11110101"
Możesz także wybrać, jak długa ma być reprezentacja ciągu, co może być przydatne, jeśli chcesz porównać liczby binarne o stałej szerokości:
1.upto(10).each {|n| puts "%04b"% n }0001001000110100010101100111100010011010
Zrobiłem lokalny test, aby przekonwertować liczby całkowite na ciąg binarny, ale wynik pokazuje, że kody takie jak 245.to_s(2)będą szybsze niż"%b" % 245
Zielony Nie
Również to nie działa poprawnie z wartościami ujemnymi.
Alex
21
Biorąc pod uwagę pomysł na tabelę przeglądową bta, możesz utworzyć tabelę przeglądową z blokiem. Wartości są generowane, gdy są po raz pierwszy otwierane i przechowywane na później:
Można by oczywiście użyć Integer#to_s(2), String#to_i(2)albo "%b"w prawdziwym programem, ale jeśli jesteś zainteresowany w jaki prac tłumaczeniowych, metoda ta oblicza binarną reprezentację dana liczba całkowita przy użyciu podstawowych operatorów:
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 +=1end#Reverse output to match the endianness of %b
output.reverse
end
Aby sprawdzić, czy działa:
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 1end
puts custom
end
Jeśli pracujesz tylko z pojedynczymi cyframi 0-9, prawdopodobnie szybciej utworzysz tabelę odnośników, więc nie musisz za każdym razem wywoływać funkcji konwersji.
Indeksowanie do tej tablicy skrótów przy użyciu reprezentacji liczby całkowitej lub łańcucha daje jej binarną reprezentację jako ciąg.
Jeśli chcesz, aby ciągi binarne miały określoną liczbę cyfr (zachowaj zera wiodące), zmień x.to_s(2)na sprintf "%04b", x(gdzie 4jest minimalna liczba cyfr do użycia).
@ bta- Koduję wszystkie te znaki w postaci binarnej, aby móc ich użyć w algorytmie genetycznym. Bardzo podoba mi się pomysł tabeli przeglądowej dla kodowania / dekodowania, ponieważ zestaw jest ograniczony do 0..9 i + - * /
mcmaloney
2
Jeśli szukasz klasy / metody Ruby, użyłem tego, a także dołączyłem testy:
classBinarydefself.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
endendclassBinaryTest<Test::Unit::TestCasedef test_1
test1 =Binary.binary_to_decimal(0001)
assert_equal 1, test1
enddef test_8
test8 =Binary.binary_to_decimal(1000)
assert_equal 8, test8
enddef test_15
test15 =Binary.binary_to_decimal(1111)
assert_equal 15, test15
enddef test_12341
test12341 =Binary.binary_to_decimal(11000000110101)
assert_equal 12341, test12341
endend
Odpowiedzi:
Masz
Integer#to_s(base)
iString#to_i(base)
jesteś dostępny.Integer#to_s(base)
konwertuje liczbę dziesiętną na łańcuch reprezentujący liczbę o określonej podstawie:podczas gdy odwrotność uzyskuje się z
String#to_i(base)
:źródło
("%08b" % int)
lub,("%08b" % string)
aby zwrócić stałą liczbę bitów.-9.to_s(2)
=> "-1001"
Czy ktoś może to wyjaśnić?9
jest1001
binarny.Zadałem podobne pytanie . Opierając się na odpowiedzi @sawa , najbardziej zwięzłym sposobem przedstawienia liczby całkowitej w ciągu w formacie binarnym jest użycie programu formatującego ciąg:
Możesz także wybrać, jak długa ma być reprezentacja ciągu, co może być przydatne, jeśli chcesz porównać liczby binarne o stałej szerokości:
źródło
245.to_s(2)
będą szybsze niż"%b" % 245
Biorąc pod uwagę pomysł na tabelę przeglądową bta, możesz utworzyć tabelę przeglądową z blokiem. Wartości są generowane, gdy są po raz pierwszy otwierane i przechowywane na później:
źródło
Można by oczywiście użyć
Integer#to_s(2)
,String#to_i(2)
albo"%b"
w prawdziwym programem, ale jeśli jesteś zainteresowany w jaki prac tłumaczeniowych, metoda ta oblicza binarną reprezentację dana liczba całkowita przy użyciu podstawowych operatorów:Aby sprawdzić, czy działa:
źródło
Jeśli pracujesz tylko z pojedynczymi cyframi 0-9, prawdopodobnie szybciej utworzysz tabelę odnośników, więc nie musisz za każdym razem wywoływać funkcji konwersji.
Indeksowanie do tej tablicy skrótów przy użyciu reprezentacji liczby całkowitej lub łańcucha daje jej binarną reprezentację jako ciąg.
Jeśli chcesz, aby ciągi binarne miały określoną liczbę cyfr (zachowaj zera wiodące), zmień
x.to_s(2)
nasprintf "%04b", x
(gdzie4
jest minimalna liczba cyfr do użycia).źródło
Jeśli szukasz klasy / metody Ruby, użyłem tego, a także dołączyłem testy:
źródło