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.
// Gray code
 
function encode(v: number): number {
  return v ^ (v >> 1);
}
 
function decode(v: number): number {
  var result = 0;
  while (v > 0) {
    result ^= v;
    v >>= 1;
  }
  return result;
}
 
console.log("decimal  binary   gray    decoded");
for (var i = 0; i <= 31; i++) {
  var g = encode(i);
  var d = decode(g);
  process.stdout.write(
    "  " + i.toString().padStart(2, " ") + 
    "     " + i.toString(2).padStart(5, "0") + 
    "   " + g.toString(2).padStart(5, "0") + 
    "   " + d.toString(2).padStart(5, "0") + 
    "  " + d.toString().padStart(2, " "));
  console.log();
} 
 