如何在Lua中使用按位运算符XOR?

发布于 2024-11-06 22:35:51 字数 48 浏览 0 评论 0原文

如何在Lua语言中实现按位运算符?
具体来说,我需要一个异或运算符/方法。

How can I implement bitwise operators in Lua language?
Specifically, I need a XOR operator/method.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

巷子口的你 2024-11-13 22:35:51

在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

In Lua 5.2, you can use functions in bit32 library.

In Lua 5.3, bit32 library is obsoleted because there are now native bitwise operators.

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

Output:

1
7
6
3
14
-8
八巷 2024-11-13 22:35:51

在Lua 5.2中,您可以使用bit32.bxor函数。

In Lua 5.2, you can use the bit32.bxor function.

荒人说梦 2024-11-13 22:35:51

由于您引用了下限函数 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

如果您需要的不止于此,请说“与”、“或”和“非”,那么我也可以满足您的要求。

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

别担心,您不需要改变任何东西。

Since you're referencing the floor function 3 times, using an excessive number of loops for most operations (numbers less than 2^31 don't need all 31 loops), are using the ^ operator, and aren't capitalizing on the fact that a and b might be wildly different numbers with different magnitudes, you're losing a lot of efficiency. The function also isn't localized, and you're doing two more division operations than you need to. I wrote this to be reasonably fast.

In general, you're going to see improvements of about 3 to 20 times.

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

If you need more than this, say AND, OR, and NOT, then I've got you covered there, too.

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

Don't worry, you won't need to change anything.

牛↙奶布丁 2024-11-13 22:35:51

如果您需要一种有效的方法来进行按位移位,我写了 不久前有一篇关于此的文章。以下是封装该技术的一些函数:

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

function rshift(x, by)
  return math.floor(x / 2 ^ by)
end

If you're needing an efficient way to do bitwise shifts, I wrote an article about that a while ago. Here's some functions which wrap the technique:

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

function rshift(x, by)
  return math.floor(x / 2 ^ by)
end
回梦 2024-11-13 22:35:51

来自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

From the OP; moved from question into this answer.


This is how I implemented XOR in Lua:

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
冷血 2024-11-13 22:35:51

尝试:

function xor(a,b)
 return (a or b) and not (a and b)
end 

Try:

function xor(a,b)
 return (a or b) and not (a and b)
end 
旧竹 2024-11-13 22:35:51

这很简单。使用NAND逻辑。
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

希望这对某人有帮助。

This is very simple. use NAND logic.
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

if you also need 1,0 inputs insert the following to the function

    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

Hope this helps someone.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文