Advertisement
Guest User

Untitled

a guest
Aug 1st, 2019
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.54 KB | None | 0 0
  1. --[[
  2.     bitwise
  3.        
  4.     Assumes unsigned 32 bit integers
  5.  
  6.     AND, OR and XOR are unrolled into one big statement because it seems to be faster
  7.    
  8.     Source: https://bitbucket.org/Boolsheet/bslf/src/1ee664885805/bit.lua
  9.    
  10. ]]
  11.  
  12.  
  13. local function band(int1,int2,int3,...)
  14.     local ret=
  15.         ((int1%0x2>=0x1 and int2%0x2>=0x1 and 0x1)or 0)+
  16.         ((int1%0x4>=0x2 and int2%0x4>=0x2 and 0x2)or 0)+
  17.         ((int1%0x8>=0x4 and int2%0x8>=0x4 and 0x4)or 0)+
  18.         ((int1%0x10>=0x8 and int2%0x10>=0x8 and 0x8)or 0)+
  19.         ((int1%0x20>=0x10 and int2%0x20>=0x10 and 0x10)or 0)+
  20.         ((int1%0x40>=0x20 and int2%0x40>=0x20 and 0x20)or 0)+
  21.         ((int1%0x80>=0x40 and int2%0x80>=0x40 and 0x40)or 0)+
  22.         ((int1%0x100>=0x80 and int2%0x100>=0x80 and 0x80)or 0)+
  23.         ((int1%0x200>=0x100 and int2%0x200>=0x100 and 0x100)or 0)+
  24.         ((int1%0x400>=0x200 and int2%0x400>=0x200 and 0x200)or 0)+
  25.         ((int1%0x800>=0x400 and int2%0x800>=0x400 and 0x400)or 0)+
  26.         ((int1%0x1000>=0x800 and int2%0x1000>=0x800 and 0x800)or 0)+
  27.         ((int1%0x2000>=0x1000 and int2%0x2000>=0x1000 and 0x1000)or 0)+
  28.         ((int1%0x4000>=0x2000 and int2%0x4000>=0x2000 and 0x2000)or 0)+
  29.         ((int1%0x8000>=0x4000 and int2%0x8000>=0x4000 and 0x4000)or 0)+
  30.         ((int1%0x10000>=0x8000 and int2%0x10000>=0x8000 and 0x8000)or 0)+
  31.         ((int1%0x20000>=0x10000 and int2%0x20000>=0x10000 and 0x10000)or 0)+
  32.         ((int1%0x40000>=0x20000 and int2%0x40000>=0x20000 and 0x20000)or 0)+
  33.         ((int1%0x80000>=0x40000 and int2%0x80000>=0x40000 and 0x40000)or 0)+
  34.         ((int1%0x100000>=0x80000 and int2%0x100000>=0x80000 and 0x80000)or 0)+
  35.         ((int1%0x200000>=0x100000 and int2%0x200000>=0x100000 and 0x100000)or 0)+
  36.         ((int1%0x400000>=0x200000 and int2%0x400000>=0x200000 and 0x200000)or 0)+
  37.         ((int1%0x800000>=0x400000 and int2%0x800000>=0x400000 and 0x400000)or 0)+
  38.         ((int1%0x1000000>=0x800000 and int2%0x1000000>=0x800000 and 0x800000)or 0)+
  39.         ((int1%0x2000000>=0x1000000 and int2%0x2000000>=0x1000000 and 0x1000000)or 0)+
  40.         ((int1%0x4000000>=0x2000000 and int2%0x4000000>=0x2000000 and 0x2000000)or 0)+
  41.         ((int1%0x8000000>=0x4000000 and int2%0x8000000>=0x4000000 and 0x4000000)or 0)+
  42.         ((int1%0x10000000>=0x8000000 and int2%0x10000000>=0x8000000 and 0x8000000)or 0)+
  43.         ((int1%0x20000000>=0x10000000 and int2%0x20000000>=0x10000000 and 0x10000000)or 0)+
  44.         ((int1%0x40000000>=0x20000000 and int2%0x40000000>=0x20000000 and 0x20000000)or 0)+
  45.         ((int1%0x80000000>=0x40000000 and int2%0x80000000>=0x40000000 and 0x40000000)or 0)+
  46.         ((int1>=0x80000000 and int2>=0x80000000 and 0x80000000)or 0)
  47.    
  48.     return(int3 and band(ret,int3,...))or ret
  49. end
  50.  
  51. local function bor(int1,int2,int3,...)
  52.     local ret=
  53.         (((int1%0x2>=0x1 or(int2%0x2>=0x1))and 0x1)or 0)+
  54.         (((int1%0x4>=0x2 or(int2%0x4>=0x2))and 0x2)or 0)+
  55.         (((int1%0x8>=0x4 or(int2%0x8>=0x4))and 0x4)or 0)+
  56.         (((int1%0x10>=0x8 or(int2%0x10>=0x8))and 0x8)or 0)+
  57.         (((int1%0x20>=0x10 or(int2%0x20>=0x10))and 0x10)or 0)+
  58.         (((int1%0x40>=0x20 or(int2%0x40>=0x20))and 0x20)or 0)+
  59.         (((int1%0x80>=0x40 or(int2%0x80>=0x40))and 0x40)or 0)+
  60.         (((int1%0x100>=0x80 or(int2%0x100>=0x80))and 0x80)or 0)+
  61.         (((int1%0x200>=0x100 or(int2%0x200>=0x100))and 0x100)or 0)+
  62.         (((int1%0x400>=0x200 or(int2%0x400>=0x200))and 0x200)or 0)+
  63.         (((int1%0x800>=0x400 or(int2%0x800>=0x400))and 0x400)or 0)+
  64.         (((int1%0x1000>=0x800 or(int2%0x1000>=0x800))and 0x800)or 0)+
  65.         (((int1%0x2000>=0x1000 or(int2%0x2000>=0x1000))and 0x1000)or 0)+
  66.         (((int1%0x4000>=0x2000 or(int2%0x4000>=0x2000))and 0x2000)or 0)+
  67.         (((int1%0x8000>=0x4000 or(int2%0x8000>=0x4000))and 0x4000)or 0)+
  68.         (((int1%0x10000>=0x8000 or(int2%0x10000>=0x8000))and 0x8000)or 0)+
  69.         (((int1%0x20000>=0x10000 or(int2%0x20000>=0x10000))and 0x10000)or 0)+
  70.         (((int1%0x40000>=0x20000 or(int2%0x40000>=0x20000))and 0x20000)or 0)+
  71.         (((int1%0x80000>=0x40000 or(int2%0x80000>=0x40000))and 0x40000)or 0)+
  72.         (((int1%0x100000>=0x80000 or(int2%0x100000>=0x80000))and 0x80000)or 0)+
  73.         (((int1%0x200000>=0x100000 or(int2%0x200000>=0x100000))and 0x100000)or 0)+
  74.         (((int1%0x400000>=0x200000 or(int2%0x400000>=0x200000))and 0x200000)or 0)+
  75.         (((int1%0x800000>=0x400000 or(int2%0x800000>=0x400000))and 0x400000)or 0)+
  76.         (((int1%0x1000000>=0x800000 or(int2%0x1000000>=0x800000))and 0x800000)or 0)+
  77.         (((int1%0x2000000>=0x1000000 or(int2%0x2000000>=0x1000000))and 0x1000000)or 0)+
  78.         (((int1%0x4000000>=0x2000000 or(int2%0x4000000>=0x2000000))and 0x2000000)or 0)+
  79.         (((int1%0x8000000>=0x4000000 or(int2%0x8000000>=0x4000000))and 0x4000000)or 0)+
  80.         (((int1%0x10000000>=0x8000000 or(int2%0x10000000>=0x8000000))and 0x8000000)or 0)+
  81.         (((int1%0x20000000>=0x10000000 or(int2%0x20000000>=0x10000000))and 0x10000000)or 0)+
  82.         (((int1%0x40000000>=0x20000000 or(int2%0x40000000>=0x20000000))and 0x20000000)or 0)+
  83.         (((int1%0x80000000>=0x40000000 or(int2%0x80000000>=0x40000000))and 0x40000000)or 0)+
  84.         (((int1>=0x80000000 or(int2>=0x80000000))and 0x80000000)or 0)
  85.    
  86.     return(int3 and bor(ret,int3,...))or ret
  87. end
  88.  
  89. local function bxor(int1,int2,int3,...)
  90.     local ret=
  91.         ((int1%0x2>=0x1~=(int2%0x2>=0x1)and 0x1)or 0)+
  92.         ((int1%0x4>=0x2~=(int2%0x4>=0x2)and 0x2)or 0)+
  93.         ((int1%0x8>=0x4~=(int2%0x8>=0x4)and 0x4)or 0)+
  94.         ((int1%0x10>=0x8~=(int2%0x10>=0x8)and 0x8)or 0)+
  95.         ((int1%0x20>=0x10~=(int2%0x20>=0x10)and 0x10)or 0)+
  96.         ((int1%0x40>=0x20~=(int2%0x40>=0x20)and 0x20)or 0)+
  97.         ((int1%0x80>=0x40~=(int2%0x80>=0x40)and 0x40)or 0)+
  98.         ((int1%0x100>=0x80~=(int2%0x100>=0x80)and 0x80)or 0)+
  99.         ((int1%0x200>=0x100~=(int2%0x200>=0x100)and 0x100)or 0)+
  100.         ((int1%0x400>=0x200~=(int2%0x400>=0x200)and 0x200)or 0)+
  101.         ((int1%0x800>=0x400~=(int2%0x800>=0x400)and 0x400)or 0)+
  102.         ((int1%0x1000>=0x800~=(int2%0x1000>=0x800)and 0x800)or 0)+
  103.         ((int1%0x2000>=0x1000~=(int2%0x2000>=0x1000)and 0x1000)or 0)+
  104.         ((int1%0x4000>=0x2000~=(int2%0x4000>=0x2000)and 0x2000)or 0)+
  105.         ((int1%0x8000>=0x4000~=(int2%0x8000>=0x4000)and 0x4000)or 0)+
  106.         ((int1%0x10000>=0x8000~=(int2%0x10000>=0x8000)and 0x8000)or 0)+
  107.         ((int1%0x20000>=0x10000~=(int2%0x20000>=0x10000)and 0x10000)or 0)+
  108.         ((int1%0x40000>=0x20000~=(int2%0x40000>=0x20000)and 0x20000)or 0)+
  109.         ((int1%0x80000>=0x40000~=(int2%0x80000>=0x40000)and 0x40000)or 0)+
  110.         ((int1%0x100000>=0x80000~=(int2%0x100000>=0x80000)and 0x80000)or 0)+
  111.         ((int1%0x200000>=0x100000~=(int2%0x200000>=0x100000)and 0x100000)or 0)+
  112.         ((int1%0x400000>=0x200000~=(int2%0x400000>=0x200000)and 0x200000)or 0)+
  113.         ((int1%0x800000>=0x400000~=(int2%0x800000>=0x400000)and 0x400000)or 0)+
  114.         ((int1%0x1000000>=0x800000~=(int2%0x1000000>=0x800000)and 0x800000)or 0)+
  115.         ((int1%0x2000000>=0x1000000~=(int2%0x2000000>=0x1000000)and 0x1000000)or 0)+
  116.         ((int1%0x4000000>=0x2000000~=(int2%0x4000000>=0x2000000)and 0x2000000)or 0)+
  117.         ((int1%0x8000000>=0x4000000~=(int2%0x8000000>=0x4000000)and 0x4000000)or 0)+
  118.         ((int1%0x10000000>=0x8000000~=(int2%0x10000000>=0x8000000)and 0x8000000)or 0)+
  119.         ((int1%0x20000000>=0x10000000~=(int2%0x20000000>=0x10000000)and 0x10000000)or 0)+
  120.         ((int1%0x40000000>=0x20000000~=(int2%0x40000000>=0x20000000)and 0x20000000)or 0)+
  121.         ((int1%0x80000000>=0x40000000~=(int2%0x80000000>=0x40000000)and 0x40000000)or 0)+
  122.         ((int1>=0x80000000~=(int2>=0x80000000)and 0x80000000)or 0)
  123.    
  124.     return(int3 and bxor(ret,int3,...))or ret
  125. end
  126.  
  127. local function bxor8(byte1,byte2,byte3,...)
  128.     local ret=
  129.         ((byte1%2==1~=(byte2%2==1)and 1)or 0)+
  130.         ((byte1%4>=2~=(byte2%4>=2)and 2)or 0)+
  131.         ((byte1%8>=4~=(byte2%8>=4)and 4)or 0)+
  132.         ((byte1%16>=8~=(byte2%16>=8)and 8)or 0)+
  133.         ((byte1%32>=16~=(byte2%32>=16)and 16)or 0)+
  134.         ((byte1%64>=32~=(byte2%64>=32)and 32)or 0)+
  135.         ((byte1%128>=64~=(byte2%128>=64)and 64)or 0)+
  136.         ((byte1>=128~=(byte2>=128)and 128)or 0)
  137.    
  138.     return(byte3 and bxor8(ret,byte3,...))or ret
  139. end
  140.  
  141. local md={
  142.     band=band,
  143.     bor=bor,
  144.     bxor=bxor,
  145.     bxor8=bxor8,
  146. }
  147.  
  148. function md.bnot(int)
  149.     return 4294967295-int
  150. end
  151.  
  152. function md.bnot8(byte)
  153.     return 255-byte
  154. end
  155.  
  156. function md.lshift(int,by)
  157.     return(int*(2^by))%(2^32)
  158. end
  159.  
  160. function md.rshift(int,by)
  161.     local shifted=int/(2^by)
  162.     return shifted-shifted%1
  163. end
  164.  
  165. function md.arshift(int,by)
  166.     local pf=2^by
  167.     local shifted=int/pf
  168.     return shifted-shifted%1+((int>=2^31 and(pf-1)*2^(32-by))or 0)
  169. end
  170.  
  171.  
  172. function md.lrot(int,by)
  173.     local shifted=int/(2^(32-by))
  174.     local fraction=shifted%1
  175.     return(shifted-fraction)+fraction*2^32
  176. end
  177.  
  178. function md.rrot(int,by)
  179.     local shifted=int/(2^by)
  180.     local fraction=shifted%1
  181.     return(shifted-fraction)+fraction*2^32
  182. end
  183.  
  184. --https://github.com/kikito/sha1.lua/blob/master/src/sha1/bit32_ops.lua
  185. function md.ternary(a,b,c)--c ~ (a & (b ~ c)) has less bitwise operations than (a & b) | (~a & c)
  186.     return bxor(c,band(a,bxor(b,c)))
  187. end
  188.  
  189. function md.majority(a,b,c)--(a & (b | c)) | (b & c) has less bitwise operations than (a & b) | (a & c) | (b & c)
  190.     return bor(band(a,bor(b,c)),band(b,c))
  191. end
  192.  
  193. return md
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement