Перебирая биты в целое число, рубин
Я делаю программу, в которой одна из проблем заключается в том, что мне нужно провести некоторый анализ битового шаблона в некоторых целых числах.
Из-за этого я хотел бы иметь возможность сделать что-то вроде этого:
#Does **NOT** work:
num.each_bit do |i|
#do something with i
end
Я смог сделать что-то, что работает, сделав:
num.to_s(2).each_char do |c|
#do something with c as a char
end
Это, однако, не имеетperformance Мне бы хотелось.
Я обнаружил, что вы можете сделать это:
0.upto(num/2) do |i|
#do something with n[i]
end
Это имеет еще худшую производительность, чемeach_char
метод
Этот цикл будет выполняться миллионы или более раз, поэтому я бы хотел, чтобы он был максимально быстрым.
Для справки, вот вся функция
@@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