Cuando dice que desea convertir operadores matemáticos en cadenas binarias, ¿qué quiere decir exactamente? ¿Usar la representación ASCII escrita en binario?
bta
¿Supongo que querías hacer el popular algoritmo genético? :-)
nemesisfixx
Respuestas:
372
Tienes Integer#to_s(base)y String#to_i(base)disponible para ti.
Integer#to_s(base) convierte un número decimal en una cadena que representa el número en la base especificada:
9.to_s(2)#=> "1001"
mientras que el reverso se obtiene con String#to_i(base):
@ user1201917 ¿Qué hay de malo en eso? 9Está 1001en binario.
preferred_anon
41
Hice una pregunta similar . Según la respuesta de @sawa , la forma más sucinta de representar un número entero en una cadena en formato binario es usar el formateador de cadena:
"%b"%245=>"11110101"
También puede elegir qué tan larga será la representación de cadena, lo que podría ser útil si desea comparar números binarios de ancho fijo:
1.upto(10).each {|n| puts "%04b"% n }0001001000110100010101100111100010011010
Hice una prueba local para convertir enteros a cadenas binarias, pero el resultado muestra que códigos como 245.to_s(2)serán más rápidos que"%b" % 245
Green Su
Además, esto no funciona correctamente con valores negativos.
alex
21
Al retomar la idea de la tabla de búsqueda de bta, puede crear la tabla de búsqueda con un bloque. Los valores se generan cuando se accede por primera vez y se almacenan para más adelante:
Naturalmente Integer#to_s(2), lo usaría , String#to_i(2)o "%b"en un programa real, pero, si está interesado en cómo funciona la traducción, este método calcula la representación binaria de un entero dado utilizando operadores básicos:
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
Para comprobar que funciona:
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
Si solo está trabajando con los dígitos individuales 0-9, es probable que sea más rápido crear una tabla de búsqueda para que no tenga que llamar a las funciones de conversión cada vez.
La indexación en esta tabla hash usando el número entero o la representación de cadena de un número producirá su representación binaria como una cadena.
Si necesita que las cadenas binarias tengan un cierto número de dígitos (mantenga los ceros a la izquierda), cambie x.to_s(2) a sprintf "%04b", x(donde 4es el número mínimo de dígitos a usar).
@ bta: estoy codificando todos estos caracteres en binario para poder usarlos en un algoritmo genético. Realmente me gusta la idea de una tabla de búsqueda para la codificación / decodificación ya que el conjunto está limitado a 0..9 y + - * /
mcmaloney
2
Si está buscando una clase / método Ruby, lo usé y también he incluido las pruebas:
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
Respuestas:
Tienes
Integer#to_s(base)
yString#to_i(base)
disponible para ti.Integer#to_s(base)
convierte un número decimal en una cadena que representa el número en la base especificada:mientras que el reverso se obtiene con
String#to_i(base)
:fuente
("%08b" % int)
o("%08b" % string)
para devolver un número fijo de bits.-9.to_s(2)
=> "-1001"
¿Alguien puede explicar esto?9
Está1001
en binario.Hice una pregunta similar . Según la respuesta de @sawa , la forma más sucinta de representar un número entero en una cadena en formato binario es usar el formateador de cadena:
También puede elegir qué tan larga será la representación de cadena, lo que podría ser útil si desea comparar números binarios de ancho fijo:
fuente
245.to_s(2)
serán más rápidos que"%b" % 245
Al retomar la idea de la tabla de búsqueda de bta, puede crear la tabla de búsqueda con un bloque. Los valores se generan cuando se accede por primera vez y se almacenan para más adelante:
fuente
Naturalmente
Integer#to_s(2)
, lo usaría ,String#to_i(2)
o"%b"
en un programa real, pero, si está interesado en cómo funciona la traducción, este método calcula la representación binaria de un entero dado utilizando operadores básicos:Para comprobar que funciona:
fuente
Si solo está trabajando con los dígitos individuales 0-9, es probable que sea más rápido crear una tabla de búsqueda para que no tenga que llamar a las funciones de conversión cada vez.
La indexación en esta tabla hash usando el número entero o la representación de cadena de un número producirá su representación binaria como una cadena.
Si necesita que las cadenas binarias tengan un cierto número de dígitos (mantenga los ceros a la izquierda), cambie
x.to_s(2)
asprintf "%04b", x
(donde4
es el número mínimo de dígitos a usar).fuente
Si está buscando una clase / método Ruby, lo usé y también he incluido las pruebas:
fuente