18

Lua 言語でビット演算子を実装するにはどうすればよいですか?
具体的には、XOR 演算子/メソッドが必要です。

4

7 に答える 7

29

bit32Lua 5.2 では、ライブラリ内の関数を使用できます。

Lua 5.3 では、ネイティブのビット演算子bit32が存在するため、ライブラリは廃止されました。

print(3 & 5)  -- bitwise and
print(3 | 5)  -- bitwise or
print(3 ~ 5)  -- bitwise xor
print(7 >> 1) -- bitwise right shift
print(7 << 1) -- bitwise left shift
print(~7)     -- bitwise not

出力:

1
7
6
3
14
-8
于 2015-01-16T11:25:46.757 に答える
11

Lua 5.2 では、関数を使用できますbit32.bxor

于 2011-05-16T18:07:59.653 に答える
9

floor 関数を 3 回参照しているため、ほとんどの操作で過剰な数のループを使用しており (2^31 未満の数値では 31 回のループすべてが必要というわけではありません)、^ 演算子を使用しており、その事実を利用していません。 a と b の大きさが大きく異なる数値である可能性があるため、多くの効率が失われます。関数もローカライズされておらず、必要以上に 2 つの除算を行っています。私はこれをかなり速くするために書きました。

一般に、約 3 ~ 20 倍の改善が見られます。

local function BitXOR(a,b)--Bitwise xor
    local p,c=1,0
    while a>0 and b>0 do
        local ra,rb=a%2,b%2
        if ra~=rb then c=c+p end
        a,b,p=(a-ra)/2,(b-rb)/2,p*2
    end
    if a<b then a=b end
    while a>0 do
        local ra=a%2
        if ra>0 then c=c+p end
        a,p=(a-ra)/2,p*2
    end
    return c
end

これ以上必要な場合は、AND、OR、NOT と言ってください。

local function BitOR(a,b)--Bitwise or
    local p,c=1,0
    while a+b>0 do
        local ra,rb=a%2,b%2
        if ra+rb>0 then c=c+p end
        a,b,p=(a-ra)/2,(b-rb)/2,p*2
    end
    return c
end

local function BitNOT(n)
    local p,c=1,0
    while n>0 do
        local r=n%2
        if r<1 then c=c+p end
        n,p=(n-r)/2,p*2
    end
    return c
end

local function BitAND(a,b)--Bitwise and
    local p,c=1,0
    while a>0 and b>0 do
        local ra,rb=a%2,b%2
        if ra+rb>1 then c=c+p end
        a,b,p=(a-ra)/2,(b-rb)/2,p*2
    end
    return c
end

何も変更する必要はありません。

于 2014-08-31T17:19:04.633 に答える
5

ビット単位のシフトを行う効率的な方法が必要な場合は、少し前にそれに関する記事を書きました。テクニックをラップするいくつかの関数を次に示します。

function lshift(x, by)
  return x * 2 ^ by
end

function rshift(x, by)
  return math.floor(x / 2 ^ by)
end
于 2011-05-17T04:30:06.487 に答える