我正在使用redis lua,并需要在一个字段上执行位运算逻辑,该字段最多有53位(redis有序集分数整数部分的默认长度)
但似乎我没有运气:
127.0.0.1:6379> eval 'return bit.lshift(1, 30) ' 0
(integer) 1073741824
127.0.0.1:6379> eval 'return bit.lshift(1, 31) ' 0
(integer) -2147483648
看起来 bit.* 只能在 30 位上操作,然后就会溢出(32 位有符号整数)
我正在使用 Linux 64 位系统,并且 redis 也是编译为 64 位的。 似乎这是 bit 库的一个限制:
http://bitop.luajit.org/api.html
请注意,所有位运算都返回带符号的 32 位数字(原理)。 默认情况下,这些数字将显示为带符号的十进制数。
另一方面...
eval 'return math.pow(2, 53) ' 0
(integer) 9007199254740992
你有什么更好的方法来解决这个问题吗?
P.S. 有人会说将此逻辑移到客户端,但我不能这样做。这段代码相当复杂,并且需要与数据密切配合工作。