首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Lua中比较两个数字时以位为单位计算的差异

在Lua中比较两个数字时以位为单位计算的差异
EN

Stack Overflow用户
提问于 2013-12-26 18:13:00
回答 4查看 663关注 0票数 2

我想比较两个数字,以确定必须翻转的位数,以使它们相等。

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

我可以手动完成这个任务,但是我想编写一个Lua函数来完成它,例如:

代码语言:javascript
复制
function (a,b)
  return hammingweight of a xor b
end

我只想比较八进制和八进制(heheh),所以函数会返回一个0-3的值。是否有比使用表更好的高效/优雅的方法来做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-26 18:44:55

Lua5.2中引入的bit32库使得这个过程相当简单。

代码语言:javascript
复制
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

但是,如果您只是在一个足够小的范围内(例如0的数字与7的数字)进行比较,那么您可以简单地预先计算并保存结果。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2013-12-26 18:28:57

如果您在下面的链接中读取该函数,您将看到,如果您有一个由每个八进制数字和二进制表示组成的数组,则使用gsub函数将八进制表示中的每个数字替换为二进制表示。

http://lua-users.org/lists/lua-l/2002-10/msg00244.html

对于gsub,您可能需要查看http://lua-users.org/wiki/StringLibraryTutorial

一旦你有了,循环每一个字符,看看它们是否不同,并标记,以抢占该位置。

票数 2
EN

Stack Overflow用户

发布于 2013-12-26 18:19:48

我认为最好的方法是这样做:

  1. 检查最右边的位,即检查这两个数字是偶数还是奇数。如果一个是,另一个不是,这个位是不同的,所以把1加到权重之和上。
  2. 向右移动1位(使用bit32.rshift(number, 1)或取整数除法的结果2)。
  3. 如果数字为0,则在1处重复。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20789237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档