如何在 Lua 语言中实现位运算符?
具体来说,我需要一个 XOR 运算符/方法。
问问题
51265 次
7 回答
29
在 Lua 5.2 中,您可以使用bit32
库中的函数。
在 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 可能是具有不同大小的完全不同的数字,您将失去很多效率。该函数也没有本地化,并且您执行的除法操作比您需要的多。我写这篇文章的速度相当快。
一般来说,你会看到大约 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 回答
1
尝试:
function xor(a,b)
return (a or b) and not (a and b)
end
于 2021-06-17T12:54:27.360 回答
0
来自 OP;从问题转移到这个答案。
这就是我在 Lua 中实现 XOR 的方式:
local floor = math.floor
function bxor (a,b)
local r = 0
for i = 0, 31 do
local x = a / 2 + b / 2
if x ~= floor (x) then
r = r + 2^i
end
a = floor (a / 2)
b = floor (b / 2)
end
return r
end
于 2019-09-18T11:05:30.363 回答
-2
这很简单。使用与非逻辑。
https://en.wikipedia.org/wiki/NAND_logic
function xor(a,b)
return not( not( a and not( a and b ) ) and not( b and not( a and b ) ) )
end
如果您还需要 1,0 个输入,请在函数中插入以下内容
a = a==1 or a == true -- to accept nil, 1, 0, true or false
b = b==1 or b == true -- to accept nil, 1, 0, true or false
希望这可以帮助某人。
于 2017-06-07T16:30:04.407 回答