lua5.1位操作
不同版本位操作的区别
lua5.1:默认不支持位操作,一般会使用BitOp库(Lua Bit Operations Module)
lua5.2:可以使用自带bit32库(lua/lbitlib.c at v5-2 · lua/lua · GitHub),也可以使用BitOp库。
lua5.3+:增加了位操作符的支持,之前自带的bit32库从lua5.3开始就废弃了
编译BitOp库
1、下载BitOp库并解压
2、这边使用visual studio 2017编译,修改msvcbuild.bat中的lua头文件和库路径
lua头文件和库文件相关的下载可以参考这边:lua包管理器luarocks使用

3、这边编译64的库,打开vs的64位命令行工具

4、进入BitOp的下载目录,执行bat文件

5、编译完后的文件

6、将生成的dll文件拷贝到lua安装目录或lua脚本当前目录

BitOp库使用
1、与、或、非(取反)、异或
require("bit") print("&", bit.band(1, 3)) -- 0b0001 & 0b0011 = 0b0001 print("|", bit.bor(1, 2)) -- 0b0001 | 0b0010 = 0b0011 print("~", bit.bnot(3)) -- ~0x0000 0003 = 0xffff fffc print("^", bit.bxor(2, 3)) -- 0b0010 ^ 0b0011 = 0b0001 print("hex(1):", bit.tohex(1, 5)) --不满5位, 左侧补0 print("hex(-1):", bit.tohex(-1)) --0xffff ffff print("hex(-4):", bit.tohex(-4)) --0xffff fffc
执行结果

2、移位
require("bit") --普通右移: 不管正、负数,左侧总是填0 print(">>>", bit.rshift(4, 2)) -- 0b0100 >>> 2 = 0b0001 print(">>>", bit.tohex(bit.rshift(-4, 2))) --0xffff fffc >>> 2 = 0x3fff ffff --算数右移: 左侧总是填符号位, 即: 正数左侧填0, 负数左侧填1 print(">>", bit.tohex(bit.arshift(-4, 2))) -- -0xffff fffc >> 2 = 0xffff ffff print(">>", bit.arshift(4, 2)) -- 0b0100 >> 2 = 0b0001 --普通左移: 右侧总是填0 print("<<", bit.lshift(1, 2)) -- 0b0001 << 2 = 0b0100
执行结果

3、其他
local bitlib = require("bit") print("rol", bitlib.rol(0x80000006, 1)) -- 0b1101: 往左移1位, 最左侧(32位处)出去的1放回最右侧 print("ror", bitlib.ror(1, 1)) -- 0x1000 0000: 往右移1位, 最右侧出去的1放回最左侧(32位处) print("ror", bitlib.ror(1, 2)) -- 0x4000 0000: 往右移2位, 最右侧出去的1放回31位处 print("swap", bitlib.bswap(0x12345678)) --8位8位的交换, 头的第1个8位(0x12)和尾的第1个8位(0x78), 头的第2个8位(0x34)和尾的第2个8位(0x56) --tobit: 标准化number,即:将number按规则转成32位整形 print("tobit", bitlib.tobit(2.32)) --丢弃小数部分 print("tobit", bitlib.tobit(0x100000001)) --超出范围取0xffff ffff
执行结果

相关链接

浙公网安备 33010602011771号