lua 中的 bit extend 库 (可能仅对非负数有效)
2015-06-09 01:06
459 查看
-- bit operation
bit = bit or {}
bit.data32 = {}
for i=1,32 do
bit.data32[i]=2^(32-i)
end
function bit._b2d(arg)
local nr=0
for i=1,32 do
if arg[i] ==1 then
nr=nr+bit.data32[i]
end
end
return nr
end
function bit._d2b(arg)
arg = arg >= 0 and arg or (0xFFFFFFFF + arg + 1)
local tr={}
for i=1,32 do
if arg >= bit.data32[i] then
tr[i]=1
arg=arg-bit.data32[i]
else
tr[i]=0
end
end
return tr
end
function bit._and(a,b)
local op1=bit._d2b(a)
local op2=bit._d2b(b)
local r={}
for i=1,32 do
if op1[i]==1 and op2[i]==1 then
r[i]=1
else
r[i]=0
end
end
return bit._b2d(r)
end
function bit._xor(a,b)
local op1 = bit._d2b(a)
local op2 = bit._d2b(b)
local r={}
for i = 1,32 do
if op1[i] == 0 then
r[i] = op2[i]
else
if op2[i] == 0 then
r[i] = 1
else
r[i] = 0
end
end
end
return bit._b2d(r)
end
function bit._rshift(a,n)
local op1=bit._d2b(a)
n = n <= 32 and n or 32
n = n >= 0 and n or 0
for i=32, n+1, -1 do
op1[i] = op1[i-n]
end
for i=1, n do
op1[i] = 0
end
return bit._b2d(op1)
end
function bit._lshift(a,n)
local op1 =bit._d2b(a)
n = n <= 32 and n or 32
n = n >= 0 and n or 0
for i = 1, 32 - n do
op1[i] = op1[i + n]
end
for i = 32 - n + 1, 32 do
op1[i] = 0
end
return bit_b2d(op1)
end
function bit._not(a)
local op1=bit._d2b(a)
local r={}
for i=1,32 do
if op1[i]==1 then
r[i]=0
else
r[i]=1
end
end
return bit._b2d(r)
end
function bit._or(a,b)
local op1=bit._d2b(a)
local op2=bit._d2b(b)
local r={}
for i=1,32 do
if op1[i]==1 or op2[i]==1 then
r[i]=1
else
r[i]=0
end
end
return bit._b2d(r)
end
bit.band = bit.band or bit._and
bit.rshift = bit.rshift or bit._rshift
bit.bnot = bit.bnot or bit._not
bit.lshift = bit.lshift or bit._lshift
bit.xor = bit.xor or bit._xor
bit = bit or {}
bit.data32 = {}
for i=1,32 do
bit.data32[i]=2^(32-i)
end
function bit._b2d(arg)
local nr=0
for i=1,32 do
if arg[i] ==1 then
nr=nr+bit.data32[i]
end
end
return nr
end
function bit._d2b(arg)
arg = arg >= 0 and arg or (0xFFFFFFFF + arg + 1)
local tr={}
for i=1,32 do
if arg >= bit.data32[i] then
tr[i]=1
arg=arg-bit.data32[i]
else
tr[i]=0
end
end
return tr
end
function bit._and(a,b)
local op1=bit._d2b(a)
local op2=bit._d2b(b)
local r={}
for i=1,32 do
if op1[i]==1 and op2[i]==1 then
r[i]=1
else
r[i]=0
end
end
return bit._b2d(r)
end
function bit._xor(a,b)
local op1 = bit._d2b(a)
local op2 = bit._d2b(b)
local r={}
for i = 1,32 do
if op1[i] == 0 then
r[i] = op2[i]
else
if op2[i] == 0 then
r[i] = 1
else
r[i] = 0
end
end
end
return bit._b2d(r)
end
function bit._rshift(a,n)
local op1=bit._d2b(a)
n = n <= 32 and n or 32
n = n >= 0 and n or 0
for i=32, n+1, -1 do
op1[i] = op1[i-n]
end
for i=1, n do
op1[i] = 0
end
return bit._b2d(op1)
end
function bit._lshift(a,n)
local op1 =bit._d2b(a)
n = n <= 32 and n or 32
n = n >= 0 and n or 0
for i = 1, 32 - n do
op1[i] = op1[i + n]
end
for i = 32 - n + 1, 32 do
op1[i] = 0
end
return bit_b2d(op1)
end
function bit._not(a)
local op1=bit._d2b(a)
local r={}
for i=1,32 do
if op1[i]==1 then
r[i]=0
else
r[i]=1
end
end
return bit._b2d(r)
end
function bit._or(a,b)
local op1=bit._d2b(a)
local op2=bit._d2b(b)
local r={}
for i=1,32 do
if op1[i]==1 or op2[i]==1 then
r[i]=1
else
r[i]=0
end
end
return bit._b2d(r)
end
bit.band = bit.band or bit._and
bit.rshift = bit.rshift or bit._rshift
bit.bnot = bit.bnot or bit._not
bit.lshift = bit.lshift or bit._lshift
bit.xor = bit.xor or bit._xor
相关文章推荐
- LuaBit 对于LUA语言位操作符LUA语言实现,依赖于LUA Number的定义。(可参看未定义的实现部分)
- Lua BitOp 提供5.1和5.2版本位操作运算 (跨平台C语言实现 说明部分1)
- lua lfs
- lua demo
- lua字符串
- 保留.lua后缀名,将lua文件打包成assetbundle
- lua闭包
- lua协程coroutine
- LUA5.2版本中提供的位运算
- tolua
- lua
- 五章 常用Lua开发库3-模板渲染
- tengine+lua实现时时在线图片缩放,剪切。
- ngx_lua 内幕
- 用lua 对cookie的控制
- 浅谈 ngx_lua 在 UPYUN 的应用
- LUA常见库和工具
- lua简洁的功能(两)
- Number类型在LUA语言中的演化1
- LUA之string的使用