Luabit的位運算

  • 2019 年 11 月 20 日
  • 筆記

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常用函數:

Tags: