Author: Dann Corbit
Date: 19:18:30 05/21/02
Go up one level in this thread
On May 20, 2002 at 02:05:46, James Robertson wrote:
>Is there any assember command to reverse the bits in an integer?
>
>(e.g. 11101010 would become 01010111)
unsigned reversebits(unsigned x)
{
/* Reverse the bits of x (32 total). */
x = ((x & 0xAAAAAAAA) >> 1) | ((x & 0x55555555) << 1);
x = ((x & 0xCCCCCCCC) >> 2) | ((x & 0x33333333) << 2);
x = ((x & 0xF0F0F0F0) >> 4) | ((x & 0x0F0F0F0F) << 4);
x = ((x & 0xFF00FF00) >> 8) | ((x & 0x00FF00FF) << 8);
x = (x >> 16) | (x << 16);
return x;
}
#ifdef UNIT_TEST
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h> /* for CHAR_BIT */
#define BITMASK(b) (1 << ((b) % CHAR_BIT))
#define BITSLOT(b) ((b) / CHAR_BIT)
#define BITTEST(a, b) ((a)[BITSLOT(b)] & BITMASK(b))
void dumpbits(char *n)
{
int i;
for (i = 0; i < sizeof(unsigned) * CHAR_BIT; i++)
if (BITTEST(n, i))
printf("1");
else
printf("0");
putchar('\n');
}
int main(void)
{
unsigned j;
unsigned i;
unsigned k;
for (j = 0; j < 100; j++) {
i = j;
k = j;
k = reversebits(k);
dumpbits((char *) &i), dumpbits((char *) &k);
}
for (j = 0; j < 100; j++) {
i = rand();
k = i;
k = reversebits(k);
dumpbits((char *) &i), dumpbits((char *) &k);
}
i = UINT_MAX;
k = i;
k = reversebits(k);
dumpbits((char *) &i), dumpbits((char *) &k);
i = 0xAAAAAAAA;
k = i;
k = reversebits(k);
dumpbits((char *) &i), dumpbits((char *) &k);
i = 0xFEFEFEFE;
k = i;
k = reversebits(k);
dumpbits((char *) &i), dumpbits((char *) &k);
return 0;
}
#endif
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.