Bucle a través de bits en un entero, ruby
Estoy haciendo un programa donde uno de los problemas es que necesito hacer un análisis del patrón de bits en algunos enteros.
Por eso me gustaría poder hacer algo como esto:
#Does **NOT** work:
num.each_bit do |i|
#do something with i
end
Pude hacer algo que funciona haciendo:
num.to_s(2).each_char do |c|
#do something with c as a char
end
Esto sin embargo no tiene laactuación Me gustaría.
He encontrado que puedes hacer esto:
0.upto(num/2) do |i|
#do something with n[i]
end
Esto tiene un rendimiento aún peor que eleach_char
método
Este bucle se ejecutará millones de veces, o más, por lo que me gustaría que fuera lo más rápido posible.
Para referencia, aquí está 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