lite-xl/data/core/bit.lua

32 lines
753 B
Lua
Raw Normal View History

2021-12-31 13:53:01 +01:00
local bit = {}
local LUA_NBITS = 32
local ALLONES = (~(((~0) << (LUA_NBITS - 1)) << 1))
local function trim(x)
return (x & ALLONES)
end
local function mask(n)
return (~((ALLONES << 1) << ((n) - 1)))
end
function bit.extract(n, field, width)
2022-01-12 00:07:14 +01:00
local w = width or 1
assert(w > 0, "width must be positive")
assert(field + w < LUA_NBITS and field + w >= 0, "trying to access non-existent bits")
local m = trim(n)
return m >> field & mask(w)
2021-12-31 13:53:01 +01:00
end
function bit.replace(n, v, field, width)
2022-01-12 00:07:14 +01:00
local w = width or 1
assert(w > 0, "width must be positive")
assert(field + w < LUA_NBITS and field + w >= 0, "trying to access non-existent bits")
local m = trim(n)
local x = v & mask(width);
return m & ~(mask(w) << field) | (x << field)
2021-12-31 13:53:01 +01:00
end
2022-01-12 00:07:14 +01:00
return bit