Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!mnetor!uunet!seismo!gatech!hubcap!grunwald
From: grunwald@M.CS.UIUC.EDU
Newsgroups: comp.hypercube
Subject: Re: T or routing question
Message-ID: <308@hubcap.UUCP>
Date: Thu, 16-Jul-87 09:11:27 EDT
Article-I.D.: hubcap.308
Posted: Thu Jul 16 09:11:27 1987
Date-Received: Sat, 18-Jul-87 06:41:58 EDT
Sender: fpst@hubcap.UUCP
Lines: 43
Approved: hypercube@hubcap.clemson.edu

The following program contains functions to compute one of many grey codes
and the inverse function for that grey code.

The loop would be defined as grey(0), grey(1), ...., grey(N-1) for N nodes.
If each node was 'nodeNumber', then you can define: 

#define wrap(x,y,z) ( (x) < y ? y : ( ( (x) > z ) ? z : x ))

	gNode = grey(nodeNumber)
	leftNode = greyinv( wrap(gNode-1, 0, N-1) );
	rightNode = greyinv( wrap(gNode+1, 0, N-1) );

'wrap' simply servers to keep the node numbers in the range 0..N-1. More
complicated structures.

main()
{
    int i;
    for (i = 0; i < 8; i++) {
	printf("%3d: [%3d, %3d] [%3d,%3d]  [%3d, %3d]\n",
	       i,
	       grey(i-1), invgrey(grey(i-1)),
	       grey(i), invgrey(grey(i)),
	       grey(i+1), invgrey(grey(i+1)));
    }
}

grey(i)
int i;
{
    return (i >> 1) ^ i;
}

invgrey(i)
int i;
{
    int j = i;
    do {
	j = ( j >> 1 );
	i ^= j;
    } while (j != 0);
    return(i);
}