Estoy haciendo un programa donde uno de los problemas es que tengo que hacer un análisis del patrón de bits en algunos enteros.Looping a través de bits en un número entero, ruby
Debido a esto me gustaría ser capaz de hacer algo como esto:
#Does **NOT** work:
num.each_bit do |i|
#do something with i
end
que era capaz de hacer algo que funciona, haciendo:
num.to_s(2).each_char do |c|
#do something with c as a char
end
Sin embargo, esto no tiene el rendimiento Me gustaría.
he encontrado que se puede hacer esto:
millones0.upto(num/2) do |i|
#do something with n[i]
end
Esto tiene un rendimiento aún peor que el each_char
método
Este circuito va a ser ejecutado de veces, o más, por lo que lo haría me gusta que sea lo más rápido posible.
Para referencia, aquí es la totalidad de la función
@@aHashMap = Hash.new(-1)
#The method finds the length of the longes continuous chain of ones, minus one
#(101110 = 2, 11 = 1, 101010101 = 0, 10111110 = 4)
def afunc(n)
if @@aHashMap[n] != -1
return @@aHashMap[n]
end
num = 0
tempnum = 0
prev = false
(n.to_s(2)).each_char do |i|
if i
if prev
tempnum += 1
if tempnum > num
num = tempnum
end
else
prev = true
end
else
prev = false
tempnum = 0
end
end
@@aHashMap[n] = num
return num
end
Si usted va para el rendimiento, la construcción de una tabla de búsqueda, probablemente sería la optimización correcto en este caso –
declarar un '' @@ variables de tipo es muy inusual. ¿Tienes una buena razón para hacerlo? – tadman
@tadman No, no tengo una muy buena razón para esto. Es solo algo que se atascó cuando estaba haciendo varables estáticos, y no me he molestado en hacer ninguna refacturación todavía. – Automatico