此问题与python - How do I decompose a number into powers of 2?平行。确实,这是同一个问题,但是我不知道如何使用Lua,而不是使用Python(或Javascript或C ++,因为这些似乎也存在)。我对Python有一个非常基本的了解,所以我首先在上面的网站中列出了代码并尝试将其转换为Lua,但没有成功。以下是我的翻译原文,以及之后:
的Python
def myfunc(x):
powers = []
i = 1
while i <= x:
if i & x:
powers.append(i)
i <<= 1
return powers
的Lua
function powerfind(n)
local powers = {}
i = 1
while i <= n do
if bit.band(i, n) then -- bitwise and check
table.insert(powers, i)
end
i = bit.shl(i, 1) -- bitwise shift to the left
end
return powers
end
不幸的是,我的版本锁定并“耗尽内存”。这是在使用数字12
作为测试之后。很可能我的Python原始知识让我失望了,而且我无法正确地将代码从Python翻译成Lua,所以希望有人可以提供一套新的眼睛并帮助我解决它。
答案 0 :(得分:4)
感谢user2357112的评论,我已经修好了,所以我发布了答案,以防其他人遇到此问题:
AncestorType
答案 1 :(得分:4)
我看到另一个,它变成了一种速度竞赛。这个也应该很容易理解。
i is the current power. It isn't used for calculations.
n is the current place in the array.
r is the remainder after a division of x by two.
如果余数为1,那么你知道i是2的幂,用于x的二进制表示。
local function powerfind(x)
local powers={
nil,nil,nil,nil,
nil,nil,nil,nil,
nil,nil,nil,nil,
nil,nil,nil,nil,
}
local i,n=1,0
while x~=0 do
local r=x%2
if r==1 then
x,n=x-1,n+1
powers[n]=i
end
x,i=x/2,2*i
end
end
运行一百万次迭代,x从1到1000000,需要0.29秒。我将powers表的大小初始化为16。