38 lines
924 B
Awk
38 lines
924 B
Awk
# Tested using GAWK
|
|
|
|
function bits2str(bits, data, mask)
|
|
{
|
|
# Source: https://www.gnu.org/software/gawk/manual/html_node/Bitwise-Functions.html
|
|
if (bits == 0)
|
|
return "0"
|
|
|
|
mask = 1
|
|
for (; bits != 0; bits = rshift(bits, 1))
|
|
data = (and(bits, mask) ? "1" : "0") data
|
|
|
|
while ((length(data) % 8) != 0)
|
|
data = "0" data
|
|
|
|
return data
|
|
}
|
|
|
|
function gray_encode(n){
|
|
# Source: https://en.wikipedia.org/wiki/Gray_code#Converting_to_and_from_Gray_code
|
|
return xor(n,rshift(n,1))
|
|
}
|
|
|
|
function gray_decode(n){
|
|
# Source: https://en.wikipedia.org/wiki/Gray_code#Converting_to_and_from_Gray_code
|
|
mask = rshift(n,1)
|
|
while(mask != 0){
|
|
n = xor(n,mask)
|
|
mask = rshift(mask,1)
|
|
}
|
|
return n
|
|
}
|
|
|
|
BEGIN{
|
|
for (i=0; i < 32; i++)
|
|
printf "%-3s => %05d => %05d => %05d\n",i, bits2str(i),bits2str(gray_encode(i)), bits2str(gray_decode(gray_encode(i)))
|
|
}
|