Aut*_*ico 12 ruby integer loops bit
我正在制作一个程序,其中一个问题是我需要对某些整数中的位模式进行一些分析.
因此,我希望能够做到这样的事情:
#Does **NOT** work:
num.each_bit do |i|
#do something with i
end
Run Code Online (Sandbox Code Playgroud)
通过这样做,我能够创造出有效的东西:
num.to_s(2).each_char do |c|
#do something with c as a char
end
Run Code Online (Sandbox Code Playgroud)
然而,这没有我想要的性能.
我发现你可以这样做:
0.upto(num/2) do |i|
#do something with n[i]
end
Run Code Online (Sandbox Code Playgroud)
这比该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
Run Code Online (Sandbox Code Playgroud)
Ste*_*fan 12
要确定连续1的最长序列的长度,这更有效:
def longest_one_chain(n)
c = 0
while n != 0
n &= n >> 1
c += 1
end
c
end
Run Code Online (Sandbox Code Playgroud)
该方法简单地计算您可以"按位AND"数字的次数,其自身向右移位1位直到它为零.
例:
______ <-- longest chain
01011011100001111110011110101010 c=0
AND 0101101110000111111001111010101
1001100000111110001110000000 c=1, 1’s deleted
AND 100110000011111000111000000
100000011110000110000000 c=2, 11’s deleted
AND 10000001111000011000000
1110000010000000 c=3, 111’s deleted
AND 111000001000000
110000000000000 c=4, 1111’s deleted
AND 11000000000000
10000000000000 c=5, 11111’s deleted
AND 1000000000000
0 c=6, 111111’s deleted
Run Code Online (Sandbox Code Playgroud)