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.