Advertisement
Guest User

bit32.lua

a guest
Jul 19th, 2019
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.04 KB | None | 0 0
  1. --[[ Backwards compat for Lua 5.3; only loaded in 5.3 because package.loaded is
  2.      prepopulated with the existing global bit32 in 5.2. ]]
  3.  
  4. local bit32 = {}
  5.  
  6. -------------------------------------------------------------------------------
  7.  
  8. local function fold(init, op, ...)
  9.   local result = init
  10.   local args = table.pack(...)
  11.   for i = 1, args.n do
  12.     result = op(result, args[i])
  13.   end
  14.   return result
  15. end
  16.  
  17. local function trim(n)
  18.   return n & 0xFFFFFFFF
  19. end
  20.  
  21. local function mask(w)
  22.   return ~(0xFFFFFFFF << w)
  23. end
  24.  
  25. function bit32.arshift(x, disp)
  26.   return x // (2 ^ disp)
  27. end
  28.  
  29. function bit32.band(...)
  30.   return fold(0xFFFFFFFF, function(a, b) return a & b end, ...)
  31. end
  32.  
  33. function bit32.bnot(x)
  34.   return ~x
  35. end
  36.  
  37. function bit32.bor(...)
  38.   return fold(0, function(a, b) return a | b end, ...)
  39. end
  40.  
  41. function bit32.btest(...)
  42.   return bit32.band(...) ~= 0
  43. end
  44.  
  45. function bit32.bxor(...)
  46.   return fold(0, function(a, b) return a ~ b end, ...)
  47. end
  48.  
  49. local function fieldargs(f, w)
  50.   w = w or 1
  51.   assert(f >= 0, "field cannot be negative")
  52.   assert(w > 0, "width must be positive")
  53.   assert(f + w <= 32, "trying to access non-existent bits")
  54.   return f, w
  55. end
  56.  
  57. function bit32.extract(n, field, width)
  58.   local f, w = fieldargs(field, width)
  59.   return (n >> f) & mask(w)
  60. end
  61.  
  62. function bit32.replace(n, v, field, width)
  63.   local f, w = fieldargs(field, width)
  64.   local m = mask(w)
  65.   return (n & ~(m << f)) | ((v & m) << f)
  66. end
  67.  
  68. function bit32.lrotate(x, disp)
  69.   if disp == 0 then
  70.     return x
  71.   elseif disp < 0 then
  72.     return bit32.rrotate(x, -disp)
  73.   else
  74.     disp = disp & 31
  75.     x = trim(x)
  76.     return trim((x << disp) | (x >> (32 - disp)))
  77.   end
  78. end
  79.  
  80. function bit32.lshift(x, disp)
  81.   return trim(x << disp)
  82. end
  83.  
  84. function bit32.rrotate(x, disp)
  85.   if disp == 0 then
  86.     return x
  87.   elseif disp < 0 then
  88.     return bit32.lrotate(x, -disp)
  89.   else
  90.     disp = disp & 31
  91.     x = trim(x)
  92.     return trim((x >> disp) | (x << (32 - disp)))
  93.   end
  94. end
  95.  
  96. function bit32.rshift(x, disp)
  97.   return trim(x >> disp)
  98. end
  99.  
  100. -------------------------------------------------------------------------------
  101.  
  102. return bit32
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement