最近在开发项目时,需要用到Lua的一些位操作,其中用到了异或,写代码的时候想当然的就以为在Lua5.3里,异或操作也像C语言一样是^, 然后就写下去了,
跑的时候也没报错,就没有再去深究这个符号的意义,直到再次测试这段代码的时候,发现结果怎么也不对,之前写的“异或”,得出来的结果居然是inf, 无穷大,于是,在绕了很多弯路,写过各种测试代码后得知:^此符号不是异或。
而实际上,在Lua5.3里,^是乘方,~才是异或,这一点实在是坑,因为~还是按位非符号,这里贴出云风的参考手册,希望大家能少踩此坑:
http://cloudwu.github.io/lua53doc/manual.html#3.4.2
3.4.1 – 数学运算操作符
Lua 支持下列数学运算操作符:
+
: 加法-
: 减法*
: 乘法/
: 浮点除法//
: 向下取整除法%
: 取模^
: 乘方-
: 取负
除了乘方和浮点除法运算, 数学运算按如下方式工作: 如果两个操作数都是整数, 该操作以整数方式操作且结果也将是一个整数。 否则,当两个操作数都是数字或可以被转换为数字的字符串 (参见 §3.4.3)时, 操作数会被转换成两个浮点数, 操作按通常的浮点规则(一般遵循 IEEE 754 标准) 来进行,结果也是一个浮点数。
乘方和浮点除法 (/
) 总是把操作数转换成浮点数进行,其结果总是浮点数。 乘方使用 ISO C 函数 pow
, 因此它也可以接受非整数的指数。
向下取整的除法 (//
) 指做一次除法,并将商圆整到靠近负无穷的一侧, 即对操作数做除法后取 floor 。
取模被定义成除法的余数,其商被圆整到靠近负无穷的一侧(向下取整的除法)。
对于整数数学运算的溢出问题, 这些操作采取的策略是按通常遵循的以 2 为补码的数学运算的 环绕 规则。 (换句话说,它们返回其运算的数学结果对 264 取模后的数字。)
3.4.2 – 位操作符
Lua 支持下列位操作符:
&
: 按位与|
: 按位或~
: 按位异或>>
: 右移<<
: 左移~
: 按位非
所有的位操作都将操作数先转换为整数 (参见 §3.4.3), 然后按位操作,其结果是一个整数。
对于右移和左移,均用零来填补空位。 移动的位数若为负,则向反方向位移; 若移动的位数的绝对值大于等于 整数本身的位数,其结果为零 (所有位都被移出)。