Gray code
Karnaugh maps
Create functions to encode a number to and decode a number from Gray code.

Display the normal binary representations, Gray code representations, and decoded Gray code values for all 5-bit binary numbers (0-31 inclusive, leading 0's not necessary).

There are many possible Gray codes. The following encodes what is called "binary reflected Gray code."

Encoding (MSB is bit 0, b is binary, g is Gray code):

if b[i-1] = 1
   g[i] = not b[i]
else
   g[i] = b[i]
Or:

g = b xor (b logically right shifted 1 time)
Decoding (MSB is bit 0, b is binary, g is Gray code):

b[0] = g[0]

for other bits:
b[i] = g[i] xor b[i-1]
Reference
 Converting Between Gray and Binary Codes. It includes step-by-step animations.
with javascript_semantics
function gray_encode(integer n)
    return xor_bits(n,floor(n/2))
end function
 
function gray_decode(integer n)
integer r = 0
    while n>0 do
        r = xor_bits(r,n)
        n = floor(n/2)
    end while
    return r
end function
 
integer e,d
puts(1," N  Binary Gray   Decoded\n"&
       "==  =====  =====  =======\n")
for i=0 to 31 do
    e = gray_encode(i)
    d = gray_decode(e)
    printf(1,"%2d  %05b  %05b  %2d\n",{i,i,e,d})
end for
