-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathbitop.lua
More file actions
62 lines (52 loc) · 1.11 KB
/
Copy pathbitop.lua
File metadata and controls
62 lines (52 loc) · 1.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
local function setbit(x, y)
return x | (1 << y)
end
local function unsetbit(x, y)
return x & ~(1 << y)
end
local function getbit(x, y)
return (x & ( 1 << y )) >> y
end
local function countbit(x)
local c = 0
while x > 0 do
c = c + 1
x = x >> 1
end
return c
end
---------------------
local function tobit(n)
local t = {}
for i = countbit(n) - 1, 0, -1 do
t[#t + 1] = tostring(getbit(n, i))
end
return table.concat(t)
end
---------------------
do
assert(countbit(0) == 0)
assert(countbit(1) == 1)
assert(countbit(2) == 2)
assert(countbit(3) == 2)
assert(countbit(4) == 3)
assert(tobit(0) == "")
assert(tobit(1) == "1")
assert(tobit(2) == "10")
assert(tobit(3) == "11")
assert(tobit(4) == "100")
end
---------------------
local function test_setbit(x, y)
x = tonumber(x, 2)
return tobit( setbit(x, y) )
end
local function test_unsetbit(x, y)
x = tonumber(x, 2)
return tobit( unsetbit(x, y) )
end
---------------------
assert(test_setbit("1110", 0) == "1111")
assert(test_unsetbit("1111", 0) == "1110")
assert(test_setbit("0111", 3) == "1111")
assert(test_unsetbit("1111", 3) == "111")