Lua: 将一个数分解为 2 的幂
Lua: Decompose a number by powers of 2
这个问题与平行。事实上,这是同一个问题,但我想知道如何使用 Lua.我对 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
不幸的是,我的版本锁定了 "runs out of memory"。这是在使用数字 12
作为测试之后。我对 Python 的原始知识很可能让我失望,而且我无法将代码从 Python 正确翻译成 Lua,所以希望有人可以提供一组新的眼睛帮我修一下。
感谢 user2357112 的评论,我已经修复了它,所以我发布了答案以防其他人遇到这个问题:
function powerfind(n)
local powers = {}
i = 1
while i <= n do
if bit.band(i, n) ~= 0 then -- bitwise and check
table.insert(powers, i)
end
i = bit.shl(i, 1) -- bitwise shift to the left
end
return powers
end
我看到另一个,它变成了一种速度竞赛。这个应该也很容易理解吧
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 秒。我将幂 table 的大小初始化为 16.
这个问题与
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
不幸的是,我的版本锁定了 "runs out of memory"。这是在使用数字 12
作为测试之后。我对 Python 的原始知识很可能让我失望,而且我无法将代码从 Python 正确翻译成 Lua,所以希望有人可以提供一组新的眼睛帮我修一下。
感谢 user2357112 的评论,我已经修复了它,所以我发布了答案以防其他人遇到这个问题:
function powerfind(n)
local powers = {}
i = 1
while i <= n do
if bit.band(i, n) ~= 0 then -- bitwise and check
table.insert(powers, i)
end
i = bit.shl(i, 1) -- bitwise shift to the left
end
return powers
end
我看到另一个,它变成了一种速度竞赛。这个应该也很容易理解吧
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 秒。我将幂 table 的大小初始化为 16.