前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Luabit的位运算

Luabit的位运算

作者头像
糖果
发布2019-11-20 19:44:58
2.3K0
发布2019-11-20 19:44:58
举报
文章被收录于专栏:糖果的实验室

Lua提供了bit库,可以对变量数据进行位运算,在某些应有场景,我们得确需要在lua中对数据进行位移,或是进行“与,或,非”,进制转换等操作。

例如有这么一种较典型的情况,我们用一个32位的整数表示RGB颜色,32位整数,被分为4个部分,每个部分8bit, 8bit可表示的10进制数的范围是0~255。

我们现在有一组RGB的颜色值: Alpha通道=8, R=4, G=2, B=1

下面是,二进制表示:

Alpha Red Green Blue

00001000 00000100 00000010 00000001

第四组 第三组 第二组 第一组

下面是,十六进制表示:

Alpha Red Green Blue

0x08 0x04 0x02 0x01

第四组 第三组 第二组 第一组

下面是,十进制表示:

134480385

我们现在要作的是把整数"134480385"的“4组”“8bit”数据截取出来。

思路和C语言二进制运算是一样,首先是“4组“每”8bit“的数据,都移动到”第一组的“位置,每一组不需要移位,然后是,第次移位后和0x000000FF这个数进行"AND"运算,清空前24位数据,保留最后的8位bit数据。

需要分解的原始数据:

local num = bit.tobit(0x08040201)

print(num)

第一组Blue数据的取得:

8 4 2 1

Alpha Red Green Blue

00001000 00000100 00000010 00000001

第四组 第三组 第二组 第一组

第一组的数据,不需要移位操作,直接将数据与"0x000000FF"进行”与“运算。

8 4 2 1

Alpha Red Green Blue

00001000 00000100 00000010 00000001

And(与运算)

00000000 00000000 00000000 11111111

结果(1)

00000000 00000000 00000000 00000001

第四组 第三组 第二组 第一组

local t_num = num

local blue = bit.band(t_num, 0x000000ff)

print("blue:"..blue)

第二组Green数据的取得:

第二组Green数据,需要先右移8位,然后,才能与"0x000000FF"进行”与“运算。

8 4 2 1

Alpha Red Green Blue

00001000 00000100 00000010 00000001

RShift(右移8位,左边空位补零)

00000000 00001000 00000100 00000010

And(与运算)

00000000 00000000 00000000 11111111

结果(2)

00000000 00000000 00000000 00000010

第四组 第三组 第二组 第一组

local t_num = bit.rshift(num, 8)

local green = bit.band(t_num, 0x000000ff)

print("green:"..green)

第三组Red数据的取得:

第三组Red数据,需要先右移16位,然后,才能与"0x000000FF"进行”与“运算。

8 4 2 1

Alpha Red Green Blue

00001000 00000100 00000010 00000001

RShift(右移16位,左边空位补零)

00000000 00000000 00001000 00000100

And(与运算)

00000000 00000000 00000000 11111111

结果(4)

00000000 00000000 00000000 00000100

第四组 第三组 第二组 第一组

第四组Alpha数据的取得:

第四组Alpha数据,需要先右移24位,然后,才能与"0x000000FF"进行”与“运算。

8 4 2 1

Alpha Red Green Blue

00001000 00000100 00000010 00000001

RShift(右移24位,左边空位补零)

00000000 00000000 00000000 00001000

And(与运算)

00000000 00000000 00000000 11111111

结果(8)

00000000 00000000 00000000 00001000

第四组 第三组 第二组 第一组

最后,取得四组数据的值:

Alpha通道=8, R=4, G=2, B=1

下面是Lua代码:

下面是Luabit常用函数:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 糖果的实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档