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.
PROC ToBinaryStr(BYTE n CHAR ARRAY s)
  BYTE i
 
  s(0)=8 i=8
  SetBlock(s+1,8,'0)
  WHILE n
  DO
    s(i)=(n&1)+'0
    n==RSH 1
    i==-1
  OD
RETURN
 
PROC PrintB2(BYTE n)
  IF n<10 THEN Put(32) FI
  PrintB(n)
RETURN
 
PROC PrintBin5(BYTE n)
  CHAR ARRAY s(9),sub(6)
 
  ToBinaryStr(n,s)
  SCopyS(sub,s,4,s(0))
  Print(sub)
RETURN
 
BYTE FUNC Encode(BYTE n)
RETURN (n XOR (n RSH 1))
 
BYTE FUNC Decode(BYTE n)
  BYTE res
 
  res=n
  DO
    n==RSH 1
    IF n THEN
      res==XOR n
    ELSE
      EXIT
    FI
  OD
RETURN (res)
 
PROC Main()
  BYTE i,g,b
  CHAR ARRAY sep=" -> "
 
  FOR i=0 TO 31
  DO
    PrintB2(i) Print(sep)
    PrintBin5(i) Print(sep)
    g=Encode(i)
    PrintBin5(g) Print(sep)
    b=Decode(g)
    PrintBin5(b) Print(sep)
    PrintB2(b) PutE()
  OD
RETURN