Gray code combines

Arithmetic on Gray codes

by i_e_b

HTML

<pre id="output"></pre>

JavaScript

function gray_encode(n) {
  return n ^ (n >> 1);
}

// log time branchless (from http://aggregate.org/MAGIC )
function gray_decode(n) {
  n ^= (n >> 16);
  n ^= (n >> 8);
  n ^= (n >> 4);
  n ^= (n >> 2);
  n ^= (n >> 1);
  return n;
}

function log(msg){
	document.getElementById("output").innerHTML+=msg;
}

log("Gray code combination tests\r\n");
log("Arithmetic\r\n");

var ba = 23;
var bb = 501;
var a = gray_encode(ba);
var b = gray_encode(bb);

var r = gray_decode(a + b);
log(`g(${ba}) + g(${bb}) = g(${r});   ${ba}+${bb}=${ba+bb}\r\n`);

var r = gray_decode(a * b);
log(`g(${ba}) * g(${bb}) = g(${r});  ${ba}*${bb}=${ba*bb}\r\n`);

var r = gray_decode(b - a);
log(`g(${bb}) - g(${ba}) = g(${r});   ${bb}-${ba}=${bb-ba}\r\n`);

var r = gray_decode(b / a);
log(`g(${bb}) / g(${ba}) = g(${r});    ${bb}/${ba}=${bb/ba}\r\n`);

log("\r\nBitwise\r\n");

var r = gray_decode(a | b);
log(`g(${ba}) | g(${bb}) = g(${r});   ${ba}|${bb}=${ba|bb}\r\n`);

var r = gray_decode(a & b);
log(`g(${ba}) & g(${bb}) = g(${r});     ${ba}&${bb}=${ba&bb}\r\n`);

var r = gray_decode(b ^ a);
log(`g(${bb}) ^ g(${ba}) = g(${r});   ${bb}^${ba}=${bb^ba}\r\n`);

var r = gray_decode(~a);
log(`~g(${ba})         = g(${r});    ~${ba}=${~ba}\r\n`);

log("\r\nShifts\r\n");

var r = gray_decode(a << 1);
log(`g(${ba}) << 1 = g(${r});    ${ba}<<1=${ba<<1}\r\n`);

var r = gray_decode(a << 2);
log(`g(${ba}) << 2 = g(${r});    ${ba}<<2=${ba<<2}\r\n`);

var r = gray_decode(a << 4);
log(`g(${ba}) << 4 = g(${r});   ${ba}<<4=${ba<<4}\r\n`);

var r = gray_decode(a >> 1);
log(`g(${ba}) >> 1 = g(${r});    ${ba}>>1=${ba>>1}\r\n`);

var r = gray_decode(a >> 2);
log(`g(${ba}) >> 2 = g(${r});     ${ba}>>2=${ba>>2}\r\n`);

var r = gray_decode(a >> 4);
log(`g(${ba}) >> 4 = g(${r});     ${ba}>>4=${ba>>4}\r\n`);