Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- bitwise
- Assumes unsigned 32 bit integers
- AND, OR and XOR are unrolled into one big statement because it seems to be faster
- Source: https://bitbucket.org/Boolsheet/bslf/src/1ee664885805/bit.lua
- ]]
- local function band(int1,int2,int3,...)
- local ret=
- ((int1%0x2>=0x1 and int2%0x2>=0x1 and 0x1)or 0)+
- ((int1%0x4>=0x2 and int2%0x4>=0x2 and 0x2)or 0)+
- ((int1%0x8>=0x4 and int2%0x8>=0x4 and 0x4)or 0)+
- ((int1%0x10>=0x8 and int2%0x10>=0x8 and 0x8)or 0)+
- ((int1%0x20>=0x10 and int2%0x20>=0x10 and 0x10)or 0)+
- ((int1%0x40>=0x20 and int2%0x40>=0x20 and 0x20)or 0)+
- ((int1%0x80>=0x40 and int2%0x80>=0x40 and 0x40)or 0)+
- ((int1%0x100>=0x80 and int2%0x100>=0x80 and 0x80)or 0)+
- ((int1%0x200>=0x100 and int2%0x200>=0x100 and 0x100)or 0)+
- ((int1%0x400>=0x200 and int2%0x400>=0x200 and 0x200)or 0)+
- ((int1%0x800>=0x400 and int2%0x800>=0x400 and 0x400)or 0)+
- ((int1%0x1000>=0x800 and int2%0x1000>=0x800 and 0x800)or 0)+
- ((int1%0x2000>=0x1000 and int2%0x2000>=0x1000 and 0x1000)or 0)+
- ((int1%0x4000>=0x2000 and int2%0x4000>=0x2000 and 0x2000)or 0)+
- ((int1%0x8000>=0x4000 and int2%0x8000>=0x4000 and 0x4000)or 0)+
- ((int1%0x10000>=0x8000 and int2%0x10000>=0x8000 and 0x8000)or 0)+
- ((int1%0x20000>=0x10000 and int2%0x20000>=0x10000 and 0x10000)or 0)+
- ((int1%0x40000>=0x20000 and int2%0x40000>=0x20000 and 0x20000)or 0)+
- ((int1%0x80000>=0x40000 and int2%0x80000>=0x40000 and 0x40000)or 0)+
- ((int1%0x100000>=0x80000 and int2%0x100000>=0x80000 and 0x80000)or 0)+
- ((int1%0x200000>=0x100000 and int2%0x200000>=0x100000 and 0x100000)or 0)+
- ((int1%0x400000>=0x200000 and int2%0x400000>=0x200000 and 0x200000)or 0)+
- ((int1%0x800000>=0x400000 and int2%0x800000>=0x400000 and 0x400000)or 0)+
- ((int1%0x1000000>=0x800000 and int2%0x1000000>=0x800000 and 0x800000)or 0)+
- ((int1%0x2000000>=0x1000000 and int2%0x2000000>=0x1000000 and 0x1000000)or 0)+
- ((int1%0x4000000>=0x2000000 and int2%0x4000000>=0x2000000 and 0x2000000)or 0)+
- ((int1%0x8000000>=0x4000000 and int2%0x8000000>=0x4000000 and 0x4000000)or 0)+
- ((int1%0x10000000>=0x8000000 and int2%0x10000000>=0x8000000 and 0x8000000)or 0)+
- ((int1%0x20000000>=0x10000000 and int2%0x20000000>=0x10000000 and 0x10000000)or 0)+
- ((int1%0x40000000>=0x20000000 and int2%0x40000000>=0x20000000 and 0x20000000)or 0)+
- ((int1%0x80000000>=0x40000000 and int2%0x80000000>=0x40000000 and 0x40000000)or 0)+
- ((int1>=0x80000000 and int2>=0x80000000 and 0x80000000)or 0)
- return(int3 and band(ret,int3,...))or ret
- end
- local function bor(int1,int2,int3,...)
- local ret=
- (((int1%0x2>=0x1 or(int2%0x2>=0x1))and 0x1)or 0)+
- (((int1%0x4>=0x2 or(int2%0x4>=0x2))and 0x2)or 0)+
- (((int1%0x8>=0x4 or(int2%0x8>=0x4))and 0x4)or 0)+
- (((int1%0x10>=0x8 or(int2%0x10>=0x8))and 0x8)or 0)+
- (((int1%0x20>=0x10 or(int2%0x20>=0x10))and 0x10)or 0)+
- (((int1%0x40>=0x20 or(int2%0x40>=0x20))and 0x20)or 0)+
- (((int1%0x80>=0x40 or(int2%0x80>=0x40))and 0x40)or 0)+
- (((int1%0x100>=0x80 or(int2%0x100>=0x80))and 0x80)or 0)+
- (((int1%0x200>=0x100 or(int2%0x200>=0x100))and 0x100)or 0)+
- (((int1%0x400>=0x200 or(int2%0x400>=0x200))and 0x200)or 0)+
- (((int1%0x800>=0x400 or(int2%0x800>=0x400))and 0x400)or 0)+
- (((int1%0x1000>=0x800 or(int2%0x1000>=0x800))and 0x800)or 0)+
- (((int1%0x2000>=0x1000 or(int2%0x2000>=0x1000))and 0x1000)or 0)+
- (((int1%0x4000>=0x2000 or(int2%0x4000>=0x2000))and 0x2000)or 0)+
- (((int1%0x8000>=0x4000 or(int2%0x8000>=0x4000))and 0x4000)or 0)+
- (((int1%0x10000>=0x8000 or(int2%0x10000>=0x8000))and 0x8000)or 0)+
- (((int1%0x20000>=0x10000 or(int2%0x20000>=0x10000))and 0x10000)or 0)+
- (((int1%0x40000>=0x20000 or(int2%0x40000>=0x20000))and 0x20000)or 0)+
- (((int1%0x80000>=0x40000 or(int2%0x80000>=0x40000))and 0x40000)or 0)+
- (((int1%0x100000>=0x80000 or(int2%0x100000>=0x80000))and 0x80000)or 0)+
- (((int1%0x200000>=0x100000 or(int2%0x200000>=0x100000))and 0x100000)or 0)+
- (((int1%0x400000>=0x200000 or(int2%0x400000>=0x200000))and 0x200000)or 0)+
- (((int1%0x800000>=0x400000 or(int2%0x800000>=0x400000))and 0x400000)or 0)+
- (((int1%0x1000000>=0x800000 or(int2%0x1000000>=0x800000))and 0x800000)or 0)+
- (((int1%0x2000000>=0x1000000 or(int2%0x2000000>=0x1000000))and 0x1000000)or 0)+
- (((int1%0x4000000>=0x2000000 or(int2%0x4000000>=0x2000000))and 0x2000000)or 0)+
- (((int1%0x8000000>=0x4000000 or(int2%0x8000000>=0x4000000))and 0x4000000)or 0)+
- (((int1%0x10000000>=0x8000000 or(int2%0x10000000>=0x8000000))and 0x8000000)or 0)+
- (((int1%0x20000000>=0x10000000 or(int2%0x20000000>=0x10000000))and 0x10000000)or 0)+
- (((int1%0x40000000>=0x20000000 or(int2%0x40000000>=0x20000000))and 0x20000000)or 0)+
- (((int1%0x80000000>=0x40000000 or(int2%0x80000000>=0x40000000))and 0x40000000)or 0)+
- (((int1>=0x80000000 or(int2>=0x80000000))and 0x80000000)or 0)
- return(int3 and bor(ret,int3,...))or ret
- end
- local function bxor(int1,int2,int3,...)
- local ret=
- ((int1%0x2>=0x1~=(int2%0x2>=0x1)and 0x1)or 0)+
- ((int1%0x4>=0x2~=(int2%0x4>=0x2)and 0x2)or 0)+
- ((int1%0x8>=0x4~=(int2%0x8>=0x4)and 0x4)or 0)+
- ((int1%0x10>=0x8~=(int2%0x10>=0x8)and 0x8)or 0)+
- ((int1%0x20>=0x10~=(int2%0x20>=0x10)and 0x10)or 0)+
- ((int1%0x40>=0x20~=(int2%0x40>=0x20)and 0x20)or 0)+
- ((int1%0x80>=0x40~=(int2%0x80>=0x40)and 0x40)or 0)+
- ((int1%0x100>=0x80~=(int2%0x100>=0x80)and 0x80)or 0)+
- ((int1%0x200>=0x100~=(int2%0x200>=0x100)and 0x100)or 0)+
- ((int1%0x400>=0x200~=(int2%0x400>=0x200)and 0x200)or 0)+
- ((int1%0x800>=0x400~=(int2%0x800>=0x400)and 0x400)or 0)+
- ((int1%0x1000>=0x800~=(int2%0x1000>=0x800)and 0x800)or 0)+
- ((int1%0x2000>=0x1000~=(int2%0x2000>=0x1000)and 0x1000)or 0)+
- ((int1%0x4000>=0x2000~=(int2%0x4000>=0x2000)and 0x2000)or 0)+
- ((int1%0x8000>=0x4000~=(int2%0x8000>=0x4000)and 0x4000)or 0)+
- ((int1%0x10000>=0x8000~=(int2%0x10000>=0x8000)and 0x8000)or 0)+
- ((int1%0x20000>=0x10000~=(int2%0x20000>=0x10000)and 0x10000)or 0)+
- ((int1%0x40000>=0x20000~=(int2%0x40000>=0x20000)and 0x20000)or 0)+
- ((int1%0x80000>=0x40000~=(int2%0x80000>=0x40000)and 0x40000)or 0)+
- ((int1%0x100000>=0x80000~=(int2%0x100000>=0x80000)and 0x80000)or 0)+
- ((int1%0x200000>=0x100000~=(int2%0x200000>=0x100000)and 0x100000)or 0)+
- ((int1%0x400000>=0x200000~=(int2%0x400000>=0x200000)and 0x200000)or 0)+
- ((int1%0x800000>=0x400000~=(int2%0x800000>=0x400000)and 0x400000)or 0)+
- ((int1%0x1000000>=0x800000~=(int2%0x1000000>=0x800000)and 0x800000)or 0)+
- ((int1%0x2000000>=0x1000000~=(int2%0x2000000>=0x1000000)and 0x1000000)or 0)+
- ((int1%0x4000000>=0x2000000~=(int2%0x4000000>=0x2000000)and 0x2000000)or 0)+
- ((int1%0x8000000>=0x4000000~=(int2%0x8000000>=0x4000000)and 0x4000000)or 0)+
- ((int1%0x10000000>=0x8000000~=(int2%0x10000000>=0x8000000)and 0x8000000)or 0)+
- ((int1%0x20000000>=0x10000000~=(int2%0x20000000>=0x10000000)and 0x10000000)or 0)+
- ((int1%0x40000000>=0x20000000~=(int2%0x40000000>=0x20000000)and 0x20000000)or 0)+
- ((int1%0x80000000>=0x40000000~=(int2%0x80000000>=0x40000000)and 0x40000000)or 0)+
- ((int1>=0x80000000~=(int2>=0x80000000)and 0x80000000)or 0)
- return(int3 and bxor(ret,int3,...))or ret
- end
- local function bxor8(byte1,byte2,byte3,...)
- local ret=
- ((byte1%2==1~=(byte2%2==1)and 1)or 0)+
- ((byte1%4>=2~=(byte2%4>=2)and 2)or 0)+
- ((byte1%8>=4~=(byte2%8>=4)and 4)or 0)+
- ((byte1%16>=8~=(byte2%16>=8)and 8)or 0)+
- ((byte1%32>=16~=(byte2%32>=16)and 16)or 0)+
- ((byte1%64>=32~=(byte2%64>=32)and 32)or 0)+
- ((byte1%128>=64~=(byte2%128>=64)and 64)or 0)+
- ((byte1>=128~=(byte2>=128)and 128)or 0)
- return(byte3 and bxor8(ret,byte3,...))or ret
- end
- local md={
- band=band,
- bor=bor,
- bxor=bxor,
- bxor8=bxor8,
- }
- function md.bnot(int)
- return 4294967295-int
- end
- function md.bnot8(byte)
- return 255-byte
- end
- function md.lshift(int,by)
- return(int*(2^by))%(2^32)
- end
- function md.rshift(int,by)
- local shifted=int/(2^by)
- return shifted-shifted%1
- end
- function md.arshift(int,by)
- local pf=2^by
- local shifted=int/pf
- return shifted-shifted%1+((int>=2^31 and(pf-1)*2^(32-by))or 0)
- end
- function md.lrot(int,by)
- local shifted=int/(2^(32-by))
- local fraction=shifted%1
- return(shifted-fraction)+fraction*2^32
- end
- function md.rrot(int,by)
- local shifted=int/(2^by)
- local fraction=shifted%1
- return(shifted-fraction)+fraction*2^32
- end
- --https://github.com/kikito/sha1.lua/blob/master/src/sha1/bit32_ops.lua
- function md.ternary(a,b,c)--c ~ (a & (b ~ c)) has less bitwise operations than (a & b) | (~a & c)
- return bxor(c,band(a,bxor(b,c)))
- end
- function md.majority(a,b,c)--(a & (b | c)) | (b & c) has less bitwise operations than (a & b) | (a & c) | (b & c)
- return bor(band(a,bor(b,c)),band(b,c))
- end
- return md
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement