gpt4 book ai didi

ruby - 循环遍历整数中的位,ruby

转载 作者:数据小太阳 更新时间:2023-10-29 06:40:53 26 4
gpt4 key购买 nike

我正在编写一个程序,其中一个问题是我需要对某些整数中的位模式进行一些分析。

正因为如此,我希望能够做这样的事情:

#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

然而,这没有我想要的性能

我发现你可以这样做:

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

最佳答案

要确定连续1的最长序列的长度,这样效率更高:

def longest_one_chain(n)
c = 0
while n != 0
n &= n >> 1
c += 1
end
c
end

该方法简单地计算您可以“按位与”数字本身向右移动 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

关于ruby - 循环遍历整数中的位,ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10911780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com