lua - 比较Lua中的两个数字时计算位数的差异

标签 lua bit-manipulation octal hammingweight

我想比较两个数字以确定必须翻转多少位才能使它们相等。

例如,5 和 6 需要 2 位翻转。

我可以手动执行此操作,但我想编写一个 Lua 函数来为我执行此操作,例如:

function (a,b)
  return hammingweight of a xor b
end

我只对八进制与八进制的比较感兴趣(嘿嘿),所以该函数将返回 0-3 的值。有没有比使用表格更好的高效/优雅的方法?

最佳答案

bit32 Lua 5.2 中引入的库使这个过程变得相当简单。

local bxor, band, rshift = bit32.bxor, bit32.band, bit32.rshift
local function ham(a, b)
  a = bxor(a, b)
  b = 0 -- Reuse b to count one bits.
  while a > 0 do
    b = b + band(a, 1)
    a = rshift(a, 1)
  end
  return b
end

print(ham(5,6)) -- 2

但是,如果您只比较足够小范围内的数字,例如 07,您可以简单地预先计算并保存结果。

local bxor = bit32.bxor
local hamcache = {[0] = 0, 1, 1, 2, 1, 2, 2, 3}
local function ham(a, b)
  return hamcache[bxor(a, b)]
end

关于lua - 比较Lua中的两个数字时计算位数的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20789237/

相关文章:

Lua - 尝试为静态链接的 Lua 添加扩展时出现 "multiple vms detected"

c++ - "x += x & (-x)"是什么意思?

algorithm - 如何在范围搜索中使用Morton Order?

javascript - 如何将 javascript regexp 中的 Euro € 符号与八进制、十六进制或 unicode 元字符匹配?

lua - 如何删除 pandoc 引用周围的括号?

oop - 我如何在 lua love2d (OOP) 中使用类

c - Lua 库中奇怪的 C 语法

Python 对大型二进制字符串的按位运算

java - 为什么我们需要 (HEX | OCT)_to_DEC 方法?

c - 一个字符如何用包含三个八进制数字的位模式来表示?