【Lua语言】如何将十六进制负数转成十进制
最近在项目中遇到一个很不起眼但没办法绕过的问题,查了很多资料,发现基本没什么人遇到过这个问题,于是写下这篇文章,做下记录,也可以帮助后面遇到该问题的小伙伴,提高学习和工作的效率。
准备工作
在计算机中,16进制的负数是以补码的形式存在的。所谓补码,就是在原码的基础上,按位取反,处理后的数据再加1,此时负数就可以直接去掉了。
比如:-3(H)=0xFD
用二进制表示:-000000011----11111101
安装开发环境
此处略过,大概流程为安装Vscode,安装便于开发的插件和Code Runner,下载Lua开发环境包,设置环境变量。
查看Lua的版本
Vscode命令行或者cmd命令窗口下输入:lua -v
Lua语言:按位操作
在进行位操作的时候,Lua语言会因为版本不同而报错
下面就介绍下几个版本的Lua语言是如何进行位操作的吧
Lua 5.1版本
Lua 5.1版本使用一个外部的bitlib库,提供几个位操作函数
--引入bit库
require "bit"
-- and操作
bit.band(a,b)
-- or操作
bit.bor(a,b)
-- xor操作
bit.bxor(a,b)
-- not操作
bit.bnot(a,b)
--左移n位
bit.lshift(a,n)
-- 右移n位
bit.rshift(a,n)
Lua 5.2版本
Lua 5.2版本提供了一个内置库bit32,同样以函数的形式提供位操作引入内置bit32库
require "bit32"
-- and操作
bit32.band(a,b)
-- or操作
bit32.bor(a,b)
-- xor操作
bit32.bxor(a,b)
-- not操作
bit32.bnot(ab)
--左移n位
bit32.lshift(a,n)
--右移n位
bit32.rshift(a,n)
Lua 5.3版本
自Lua 5.3版本后,Lua可以像C语言一样提供内置的操作符,实现按位操作。
-- and操作
a & b
--or操作
a | b
-- xor操作
a ~ b
-- not操作
~a
--左移n位
a << n
--右移n位
a >> n
场景复现
写好代码就可以按左上角的code runner或者快捷键ctrl+alt+n
可以看到,5.3.5版本的Lua支持内置操作符 ~ 异或操作,而5.1.5只能通过加载模块、调用函数的形式来实现异或操作。之前遇到的坑就是因为自己的环境是5.1.5版本,而最新的教程都是关于5.3.5及其以后的版本的操作,一直报错却找不到原因,真的很酸爽🙄
另外,目前官方已经不发布5.3.5的版本,只有5.3.6,目前本人必须要5.3.5的Lua环境,因为版本的问题踩了太多坑,怕了。无奈只能用5.3.6的版本,希望问题不大~
下面就上链接,需要5.3.1以及5.3.6的Lua版本的同学可以自行下载
链接:https://pan.baidu.com/s/1Y-s9Eag0hHgvITGKxK8IOA
提取码:0000
后面两个文件夹是可以直接用的,环境变量设置一下就行
前面两个是我用来切换版本的文件,设置好环境变量直接把备份的文件丢到bin目录里替换就可以了
总结
Lua 5.1、Lua 5.2版本对于位的操作都是需要加载模块,前者加载“bit”,后者加载"bit32",从Lua5.3.5开始,就可以使用最新教程按位操作。
有时候遇到问题的时候不仅要考虑自己的语法是否错误,比如中英文标点问题、括号是否成对匹配等,还要考虑开发环境的版本是否合适。