最近在开发项目时,需要用到Lua的一些位操作,其中用到了异或,写代码的时候想当然的就以为在Lua5.3里,异或操作也像C语言一样是^, 然后就写下去了,

跑的时候也没报错,就没有再去深究这个符号的意义,直到再次测试这段代码的时候,发现结果怎么也不对,之前写的“异或”,得出来的结果居然是inf, 无穷大,于是,在绕了很多弯路,写过各种测试代码后得知:^此符号不是异或。


而实际上,在Lua5.3里,^是乘方,~才是异或,这一点实在是坑,因为~还是按位非符号,这里贴出云风的参考手册,希望大家能少踩此坑:


 

数学运算操作符

Lua 支持下列数学运算操作符:

  • +: 加法
  • -: 减法
  • *: 乘法
  • /: 浮点除法
  • //: 向下取整除法
  • %: 取模
  • ^: 乘方
  • -: 取负

除了乘方和浮点除法运算, 数学运算按如下方式工作: 如果两个操作数都是整数, 该操作以整数方式操作且结果也将是一个整数。 否则,当两个操作数都是数字或可以被转换为数字的字符串 (参见 §3.4.3)时, 操作数会被转换成两个浮点数, 操作按通常的浮点规则(一般遵循 IEEE 754 标准) 来进行,结果也是一个浮点数。

/) 总是把操作数转换成浮点数进行,其结果总是浮点数。 乘方使用 ISO C 函数 pow, 因此它也可以接受非整数的指数。//) 指做一次除法,并将商圆整到靠近负无穷的一侧, 即对操作数做除法后取 floor 。

取模被定义成除法的余数,其商被圆整到靠近负无穷的一侧(向下取整的除法)。

对于整数数学运算的溢出问题, 这些操作采取的策略是按通常遵循的以 2 为补码的数学运算的 环绕 规则。 (换句话说,它们返回其运算的数学结果对 264 取模后的数字。)

位操作符

Lua 支持下列位操作符:

&: 

  • 按位与

|: 

  • 按位或

~: 

  • 按位异或

>>: 

  • 右移

<<: 

  • 左移

~: 

  • 按位非

 

对于右移和左移,均用零来填补空位。 移动的位数若为负,则向反方向位移; 若移动的位数的绝对值大于等于 整数本身的位数,其结果为零 (所有位都被移出)。




=============================


所以说还是对Lua5.3不熟悉啊,当时参与此项目之前,对Lua还基本不会,不过Lua实在是太好上手了,这也是它的优点之一,所以基本没怎么看过参考手册,也没看过书,基本上照着别人代码边看边写,遇到不会的就问下同事,所以导致这些细节方面容易出问题。



看来抽空还是要深入学习下这些语言细节。