Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.1 6/24/83; site unisoft.UUCP
Path: utzoo!watmath!clyde!cbosgd!ihnp4!zehntel!zinfandel!dual!unisoft!eryk
From: eryk@unisoft.UUCP (Eryk Vershen)
Newsgroups: net.lang.c
Subject: Re: reversing a mask
Message-ID: <364@unisoft.UUCP>
Date: Thu, 29-Nov-84 01:32:56 EST
Article-I.D.: unisoft.364
Posted: Thu Nov 29 01:32:56 1984
Date-Received: Fri, 30-Nov-84 08:13:02 EST
References: <1@imd.UUCP> <469@ncoast.UUCP> <691@gloria.UUCP>, <242@desint.UUCP>
Organization: UniSoft Corp., Berkeley
Lines: 42

Apropos of nothing here is a cute way to reverse bits due to C. Strachey.

int mask[] = {
	0x55555555,
	0x33333333,
	0x0F0F0F0F,
	0x00FF00FF,
	0x0000FFFF
}

long
bitrev(val)
long val;
{
	register long i;
	register int j ,k;

	i = val;
	j = 16;
	k = 4;
	while (j) {
		i = ((i & mask[k]) << j) | ((i >> j) & mask[k]);
		j >>= 1;
		k--;
	}
	return(i);
}

/*
 * Proof of the above (by example).
 *
 *  j=16  i=abcdefghijklmnopqrstuvwxyz012345
 *     8    qrstuvwxyz012345abcdefghijklmnop
 *     4    yz012345qrstuvwxijklmnopabcdefgh
 *     2    2345yz01uvwxqrstmnopijklefghabcd
 *     1    452301yzwxuvstqropmnklijghefcdab
 *     0    543210zyxwvutsrqponmlkjihgfedcba
 */
--
					- eryk vershen
					ucbvax!unisoft!eryk
					"overcoming computer literacy"