l-bit32.lmt /size: 2668 b    last modification: 2024-01-16 10:22
1if not modules then modules = { } end modules ['l-bit32'] = {
2    version = 1.001,
3    license = "the same as regular Lua",
4    source  = "bitwise.lua, v 1.24 2014/12/26 17:20:53 roberto",
5    comment = "drop-in for bit32, adapted a bit by Hans Hagen",
6
7}
8
9if bit32 then
10    return
11end
12
13local select = select -- instead of: arg = { ... }
14
15bit32 = {
16
17    bnot = function (a)
18        return ~a & 0xFFFFFFFF
19    end,
20
21    band = function (x, y, z, ...)
22        if not z then
23            return ((x or -1) & (y or -1)) & 0xFFFFFFFF
24        else
25            local res = x & y & z
26            for i=1,select("#",...) do
27                res = res & select(i,...)
28            end
29            return res & 0xFFFFFFFF
30        end
31      end,
32
33    bor = function (x, y, z, ...)
34        if not z then
35            return ((x or 0) | (y or 0)) & 0xFFFFFFFF
36        else
37            local res = x | y | z
38            for i=1,select("#",...) do
39                res = res | select(i,...)
40            end
41            return res & 0xFFFFFFFF
42        end
43    end,
44
45    bxor = function (x, y, z, ...)
46        if not z then
47            return ((x or 0) ~ (y or 0)) & 0xFFFFFFFF
48        else
49            local res = x ~ y ~ z
50            for i=1,select("#",...) do
51                res = res ~ select(i,...)
52            end
53            return res & 0xFFFFFFFF
54        end
55    end,
56
57    btest = function (x, y, z, ...)
58        if not z then
59            return (((x or -1) & (y or -1)) & 0xFFFFFFFF) ~= 0
60        else
61            local res = x & y & z
62            for i=1,select("#",...) do
63                res = res & select(i,...)
64            end
65            return (res & 0xFFFFFFFF) ~= 0
66        end
67    end,
68
69    lshift = function (a, b)
70        return ((a & 0xFFFFFFFF) << b) & 0xFFFFFFFF
71    end,
72
73    rshift = function (a, b)
74        return ((a & 0xFFFFFFFF) >> b) & 0xFFFFFFFF
75    end,
76
77    arshift = function (a, b)
78        a = a & 0xFFFFFFFF
79        if b <= 0 or (a & 0x80000000) == 0 then
80            return (a >> b) & 0xFFFFFFFF
81        else
82            return ((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFF
83        end
84    end,
85
86    lrotate = function (a ,b)
87        b = b & 31
88        a = a & 0xFFFFFFFF
89        a = (a << b) | (a >> (32 - b))
90        return a & 0xFFFFFFFF
91    end,
92
93    rrotate = function (a, b)
94        b = -b & 31
95        a = a & 0xFFFFFFFF
96        a = (a << b) | (a >> (32 - b))
97        return a & 0xFFFFFFFF
98    end,
99
100    extract = function (a, f, w)
101        return (a >> f) & ~(-1 << (w or 1))
102    end,
103
104    replace = function (a, v, f, w)
105        local mask = ~(-1 << (w or 1))
106        return ((a & ~(mask << f)) | ((v & mask) << f)) & 0xFFFFFFFF
107    end,
108
109}
110