位运算
Lua语言从5.3版本开始提供了对数值类型的一组标准位运算符(bitwise operator),这类运算符仅能作用于整形数。位运算符包括按位与,按位或,按位异或,逻辑右移,逻辑左移和一元运算符按位取反。
所有的位运算都针对构成一个整形数的所有位,在标准Lua中也就是64位。
特别要注意的Lua语言与C语言不同的是,Lua语言的两个以为操作都会用0天聪空出的为,也就是逻辑移位,Lua语言没有提供算术右移的方法。
无符号整形数
整形表示中使用一个比特来存储符号位,因此,64位整形数最大可以表示2^63-1而不是2^64-1。Lua语言不显示支持无符号整形数。
Lua原因输出常量的方式在默认情况下,打印数值时将其作为有符号整形数处理。可以使用选项%u或%x在函数string.format中指定以无符号整形数输出。
关系运算对于有符号整形数和无符号整形数是不一样的,对于有符号整形数而言,符号位被置位的整数更小,因为它代表的是负数。
因此,我们需要使用一种不同得操作来比较无符号整型数。Lua5.3提供了math.ult来完成这个需求。
无符号除法和有符号除法也不一样
function udiv (n, d)
if d < 0 then
if math.ult(n,d) then return 0
else return 1
end
end
local q = ((n >> 1) // d << 1
local r = n - q * d
if not math.ult(r,d) then q = q + 1 end
return q
end
第一个比较(d<0)等价于比较d是否大于2^63,如果大于那么商只能是能是1(n大于等于d)或0.否则,我们是被除数除以二即右移一位,然后除以除数,再把结果乘以二。右移一位相当于除以2的无符号除法,其结果是一个非负有符号整形数。后续的左移则纠正了商,还原了之前的除法。