local bit32={} local function fold(init,op,...) local result=init local args=table.pack(...) for i=1,args.n do result=op(result,args[i]) end return result end local function trim(n) return n&0xFFFFFFFF end local function mask(w) return~(0xFFFFFFFF<=0,"field cannot be negative") assert(w>0,"width must be positive") assert(f+w<=32,"trying to access non-existent bits") return f,w end function bit32.extract(n,field,width) local f,w=fieldargs(field,width) return(n>>f)&mask(w) end function bit32.replace(n,v,field,width) local f,w=fieldargs(field,width) local m=mask(w) return(n&~(m<>(32-disp))) end end function bit32.lshift(x,disp) return trim(x<>disp)|(x<<(32-disp))) end end function bit32.rshift(x,disp) return trim(x>>disp) end return bit32