Lua 言語でビット演算子を実装するにはどうすればよいですか?
具体的には、XOR 演算子/メソッドが必要です。
51265 次
7 に答える
29
bit32
Lua 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 に答える