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