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使用

image

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

image

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

image

5、编译完后的文件 

image

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

image

 

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

执行结果

image

 

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

执行结果

image

 

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

执行结果

image

 

相关链接

API Functions

 

posted @ 2025-08-03 16:05  yanghui01  阅读(72)  评论(0)    收藏  举报