我想比较两个数字,以确定必须翻转的位数,以使它们相等。
例如,5和6将需要2位翻转。
我可以手动完成这个任务,但是我想编写一个Lua函数来完成它,例如:
function (a,b)
return hammingweight of a xor b
end我只想比较八进制和八进制(heheh),所以函数会返回一个0-3的值。是否有比使用表更好的高效/优雅的方法来做到这一点?
发布于 2013-12-26 18:44:55
Lua5.2中引入的bit32库使得这个过程相当简单。
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的数字)进行比较,那么您可以简单地预先计算并保存结果。
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发布于 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。
一旦你有了,循环每一个字符,看看它们是否不同,并标记,以抢占该位置。
发布于 2013-12-26 18:19:48
我认为最好的方法是这样做:
bit32.rshift(number, 1)或取整数除法的结果2)。https://stackoverflow.com/questions/20789237
复制相似问题