使用Lua中的32位按位运算比较带符号的64位数字

我在Redis上使用Lua,想比较两个带符号的64位数字,这些数字存储在两个8字节/字符的字符串中。

如何使用Redis中可用的库进行比较? http://redis.io/commands/EVAL#available-

libraries

我想知道>/<==检查。我认为这可能涉及为每个64位int提取两个32位数字,并对它们进行一些巧妙的数学运算,但是我不确定。

我有一些代码可以使这一过程变得不那么抽象。 a0a1b0b1是用来表示MSB和2个64位有符号整数64S的LSB的所有32个数字:

-- ...

local comp_int64s = function (a0, a1, b0, b1)

local cmpres = 0

-- TOOD: Real comparison

return cmpres

end

local l, a0, a1, b0, b1

a0, l = bit.tobit(struct.unpack("I4", ARGV[1]))

a1, l = bit.tobit(struct.unpack("I4", ARGV[1], 5))

b0, l = bit.tobit(struct.unpack("I4", blob))

b1, l = bit.tobit(struct.unpack("I4", blob, 5))

print("Cmp result", comp_int64s(a0, a1, b0, b1))

编辑:添加代码

回答:

我想出了一种看起来可行的方法。虽然有点丑陋。

第一步是比较前32位,因为2个补码#的MSB符号位保持不变,因此数字保持正确的关系

-1  —> -1

0 —> 0

9223372036854775807 = 0x7fff ffff ffff ffff -> 0x7ffff ffff = 2147483647

因此,除非MSB的工作结果相等,否则从MSB的工作中返回结果,则需要对LSB进行检查。

我有几个案例来建立一些模式:

-1 = 0xffff ffff ffff ffff

-2 = 0xffff ffff ffff fffe

32 bit is:

-1 -> 0xffff ffff = -1

-2 -> 0xffff fffe = -2

-1 > -2 would be like -1 > -2 : GOOD

8589934591 = 0x0000 0001 ffff ffff

8589934590 = 0x0000 0001 ffff fffe

32 bit is:

8589934591 -> ffff ffff = -1

8589934590 -> ffff fffe = -2

8589934591 > 8589934590 would be -1 > -2 : GOOD

MSB的符号位无所谓b / c负数之间的关系与正数相同。例如,无论符号位如何,lsb值始终为0xff> 0xfe

如果低32位的MSB不同怎么办?

0xff7f ffff 7fff ffff = -36,028,799,166,447,617

0xff7f ffff ffff ffff = -36,028,797,018,963,969

32 bit is:

-..799.. -> 0x7fff ffff = 2147483647

-..797.. -> 0xffff ffff = -1

-..799.. < -..797.. would be 2147483647 < -1 : BAD!

因此,我们需要忽略低32位的符号位。而且,由于LSB的关系与符号无关,因此它们相同,因此在所有情况下仅使用最低的32位无符号即可。

这意味着我要为MSB的符号和无符号对于LSB -所以换款I4i4对于LSB。也使big

endian成为正式文件,并在struct.unpack调用上使用“>”:

-- ...

local comp_int64s = function (as0, au1, bs0, bu1)

if as0 > bs0 then

return 1

elseif as0 < bs0 then

return -1

else

-- msb's equal comparing lsbs - these are unsigned

if au1 > bu1 then

return 1

elseif au1 < bu1 then

return -1

else

return 0

end

end

end

local l, as0, au1, bs0, bu1

as0, l = bit.tobit(struct.unpack(">i4", ARGV[1]))

au1, l = bit.tobit(struct.unpack(">I4", ARGV[1], 5))

bs0, l = bit.tobit(struct.unpack(">i4", blob))

bu1, l = bit.tobit(struct.unpack(">I4", blob, 5))

print("Cmp result", comp_int64s(as0, au1, bs0, bu1))

以上是 使用Lua中的32位按位运算比较带符号的64位数字 的全部内容, 来源链接: utcz.com/qa/423312.html

回到顶部