位运算(bit)
一、简介
位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是以二进制形式进行的,位运算能够直接对整数的二进制位进行高效操作。位运算包括与(&)、或(|)、异或(^)、非(~)、左移(<<)和右移(>>)等基本操作。
二、演示功能概述
本教程教你如何用 Air724 开发板,进行 API 函数基础服务-位运算(bit)。
三、准备硬件环境
3.1 开发板准备
使用 EVB_Air724 开发板,如下图所示:
淘宝购买链接:Air724UG-NFM 开发板淘宝购买链接 ;
此开发板的详细使用说明参考:Air724UG 产品手册 中的《EVB_Air724UG_AXX 开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14 开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。
api:https://doc.openluat.com/wiki/21?wiki_page_id=2068
3.2 数据通信线
USB 数据线一根(micro usb)。
3.3 PC 电脑
WIN7以及以上版本的WINDOWS系统。
3.4 SIM 卡
中国大陆环境下,可以上网的 sim 卡。一般来说,使用移动,电信,联通的物联网卡或者手机卡都行。
3.5 组装硬件环境
USB 数据线插入 USB 口,另一端与电脑相连,拨码开关全部拨到 ON,串口切换开关选择 UART1,USB 供电的 4V 对应开关拨至 ON 档,SIM 卡放到 SIM 卡槽中锁紧,如下图所示。
四、准备软件环境
4.1 下载调试工具
使用说明参考:Luatools 下载和详细使用
4.2 源码及固件
4.2.1 底层 core 下载
下载底层固件,并解压
链接:https://docs.openluat.com/air724ug/luatos/firmware/
如下图所示,红框的是我们要使用到的。
4.2.2 本教程使用的 demo 见附件:
4.3 下载固件和脚本到开发板中
打开 Luatools,开发板上电开机,如开机成功 Luatools 会打印如下信息。
点击项目管理测试选项。
进入管理界面,如下图所示。
- 点击选择文件,选择底层固件,我的文件放在 D:\luatOS\Air724 路径中
- 点击增加脚本或资源文件,选择 之前下载的程序源码,如下图所示。
- 点击下载底层和脚本,下载完成如下图所示。
五、代码示例介绍
5.1 API 说明
位操作支持库
1.bit.bnot( value )
取反,等价于 C 语言中的~
参数 类型 释义 取值
value number 需要取反的值 0x0000 0000~0xFFFF FFFF
返回值 类型 释义 取值
result number 取反之后的值 0x0000 0000~0xFFFF FFFF
例子
--支持32位比特数按位取反
print(bit.bnot(5))--按位取反,输出-6
2.bit.band( val1, val2, … valn )
与运算,等价于 C 语言中的 val1 & val2 & … & valn
参数 类型 释义 取值
val1 number 第一个参数
val2 number 第二个参数
valn number 第 n 个参数
返回值 类型 释义 取值
result number 与运算之后的结果
例子
print(bit.band(1,1))--与,--输出1
3.bit.bor( val1, val2, … valn )
或运算,等价于 C 里面的 val1 | val2 | … | valn
参数 类型 释义 取值
val1 number 第一个参数
val2 number 第二个参数
valn number 第 n 个参数
返回值 类型 释义 取值
result number 或运算之后的结果
例子
print(bit.bor(1,2))--或,--输出3
4.bit.bxor( val1, val2, … valn )
异或运算,等价于 C 语言中的 val1 ^ val2 ^ … ^ valn
参数 类型 释义 取值
val1 number 第一个参数
val2 number 第二个参数
valn number 第 n 个参数
返回值 类型 释义 取值
result number 异或运算之后的结果, 此处为位异或
例子
print(bit.bxor(2,3,5))--异或结果为4
5.bit.lshift( value, shift )
逻辑左移,等价于 C 语言中的 value << shift
参数 类型 释义 取值
value number 移位的值
shift number 移位的位置
返回值 类型 释义 取值
result number 逻辑左移之后的结果
例子
print(bit.lshift(1,2))--逻辑左移,“100”,输出为4
6.bit.rshift( value, shift )
逻辑右移,等价于 C 语言中的 value >> shift
参数 类型 释义 取值
value number 移位的值
shift number 移位的位置
返回值 类型 释义 取值
result number 逻辑右移之后的结果
例子
print(bit.rshift(4,2))--逻辑右移,“001”,输出为1
7.bit.arshift( value, shift )
算数右移
参数 类型 释义 取值
value number 移位的值
shift number 移位的位置
返回值 类型 释义 取值
result number 逻辑右移之后的结果
例子
print(bit.arshift(2,2))--算数右移,左边添加的数与符号有关,输出为0
8.bit.bit( position )
左移运算,等价于 C 语言中的 1 << position
参数 类型 释义 取值
position number 移位的位置
返回值 类型 释义 取值
result number 需要移位的位置
例子
print(bit.bit(2))--参数是位数,作用是1向左移动两位,打印出4
9.bit.isset(value, position)
测试位数是否被置 1
参数 类型 释义 取值
value number 被测试的值
position number 被测试的位置
返回值 类型 释义 取值
result bool true:该位被置 1,false:其他 0
-- 例子1
print(bit.isset(5,0))--第一个参数是测试数字,第二个是测试位置。从右向左数0到7。是1返回true,否则返回false,该返回true
-- 例子2
print(bit.isset(5,1))--打印false
-- 例子3
print(bit.isset(5,2))--打印true
-- 例子4
print(bit.isset(5,3))--返回返回false
10.bit.isclear(value, position)
测试位数是否被置 0
参数 类型 释义 取值
value number 被测试的值
position number 被测试的位置
返回值 类型 释义 取值
result bool true:该位被置 0,false:其他 0/其它
例子
print(bit.isclear(5,0))--与上面的相反
print(bit.isclear(5,1))
print(bit.isclear(5,2))
print(bit.isclear(5,3))
11.bit.set(value, pos1, pos2, …posn)
置 1
参数 类型 释义 取值
value number 基数(需要改变的值)
pos1 number 第一位置
pos2 number 第二位置
posn number 第 n 位置
返回值 类型 释义 取值
result bool 置 1 之后的值
例子
-- 把0的第0,1,2,3位值为1
print(bit.set(0,0,1,2,3))--在相应的位数置1,打印15
12.bit.clear(value, pos1, pos2, …posn)
置 0
参数 类型 释义 取值
value number 基数(需要改变的值)
pos1 number 第一位置
pos2 number 第二位置
posn number 第 n 位置
返回值 类型 释义 取值
result bool 置 0 之后的值
例子
-- 把5的第0,2位置为0
print(bit.clear(5,0,2)) --在相应的位置置0,打印0
5.2 testBit.lua 代码
打印输出各种位操作指令。
--- 模块功能:闹钟功能测试(支持开机闹钟和关机闹钟,同时只能存在一个闹钟,如果想实现多个闹钟,等当前闹钟触发后,再次调用闹钟设置接口去配置下一个闹钟).
-- @author openLuat
-- @module alarm.testAlarm
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.14
require "sys"
require"misc"
module(...,package.seeall)
sys.taskInit(function()
sys.wait(10000)
log.info("按位取反,输出-6",bit.bnot(5))
log.info("与,--输出1",bit.band(1,1))
log.info("或,--输出3",bit.bor(1,2))
log.info("异或结果为4",bit.bxor(2,3,5))
log.info("逻辑左移,“100”,输出为4",bit.lshift(1,2))
log.info("逻辑右移,“001”,输出为1",bit.rshift(4,2))
log.info("算数右移,左边添加的数与符号有关,输出为0",bit.arshift(2,2))
log.info("参数是位数,作用是1向左移动两位,打印出4",bit.bit(2))
log.info("测试位数是否被置1",bit.isset(5,0))--第一个参数是是测试数字,第二个是测试位置。从右向左数0到7。是1返回true,否则返回false,该返回true
log.info("测试位数是否被置1",bit.isset(5,1))--打印false
log.info("测试位数是否被置1",bit.isset(5,2))--打印true
log.info("测试位数是否被置1",bit.isset(5,3))--返回返回false
log.info("测试位数是否被置0",bit.isclear(5,0))----与上面的相反
log.info("测试位数是否被置0",bit.isclear(5,1))
log.info("测试位数是否被置0",bit.isclear(5,2))
log.info("测试位数是否被置0",bit.isclear(5,3))
log.info("把0的第0,1,2,3位值为1",bit.set(0,0,1,2,3))--在相应的位数置1,打印15
log.info("把5的第0,2位置为0",bit.clear(5,0,2))--在相应的位置置0,打印0
sys.wait(2000)
end)
5.3 main.lua 代码
本代码为主程序脚本,系统启动后首先会对 4G 网络进行配置,等待网络连接成功,然后加载测试模块。
六、开机调试
6.1 开发板开机
连接好硬件并下载固件后,启动 Luatools 软件,系统运行信息将显示在界面中。红框中为开发板连接到 PC 机后正常打印的信息,如下图所示。
6.2 功能调试
打印输出各种位操作指令。
七、位操作命令列表
bit.bnot( value )
bit.band( val1, val2, ... valn )
bit.bor( val1, val2, ... valn )
bit.bxor( val1, val2, ... valn )
bit.lshift( value, shift )
bit.rshift( value, shift )
bit.arshift( value, shift )
bit.bit( position )
bit.isset(value, position)
bit.isclear(value, position)
bit.set(value, pos1, pos2, ...posn)
number=bit.clear(value, pos1, pos2, ...posn)
给读者的话
本篇文章由
杨超
开发;本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;
请登录合宙技术交流论坛,点击文档找错赢奖金-Air724UG-LuatOS-软件指南-基础服务-位运算;
用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;
我们会迅速核实并且修改文档;
同时也会为您累计找错积分,您还可能赢取月度找错奖金!