|
|
|
@ -5,7 +5,8 @@ |
|
|
|
|
#include <stdlib.h> //To define "exit", req'd by XLC. |
|
|
|
|
#include <ctime> |
|
|
|
|
|
|
|
|
|
unsigned rotatel(unsigned x, int n) { |
|
|
|
|
unsigned rotatel(unsigned x, int n) |
|
|
|
|
{ |
|
|
|
|
if ((unsigned)n > 63) {printf("rotatel, n out of range.\n"); exit(1);} |
|
|
|
|
return (x << n) | (x >> (32 - n)); |
|
|
|
|
} |
|
|
|
@ -20,7 +21,8 @@ int pop0(unsigned x) |
|
|
|
|
return x; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int pop1(unsigned x) { |
|
|
|
|
int pop1(unsigned x) |
|
|
|
|
{ |
|
|
|
|
x = x - ((x >> 1) & 0x55555555); |
|
|
|
|
x = (x & 0x33333333) + ((x >> 2) & 0x33333333); |
|
|
|
|
x = (x + (x >> 4)) & 0x0F0F0F0F; |
|
|
|
@ -32,7 +34,8 @@ int pop1(unsigned x) { |
|
|
|
|
return x*0x01010101 >> 24; |
|
|
|
|
if your machine has a fast multiplier (suggested by Jari Kirma). */ |
|
|
|
|
|
|
|
|
|
int pop2(unsigned x) { |
|
|
|
|
int pop2(unsigned x) |
|
|
|
|
{ |
|
|
|
|
unsigned n; |
|
|
|
|
|
|
|
|
|
n = (x >> 1) & 033333333333; // Count bits in
|
|
|
|
@ -42,12 +45,14 @@ int pop2(unsigned x) { |
|
|
|
|
x = (x + (x >> 3)) & 030707070707; // 6-bit sums.
|
|
|
|
|
return x%63; // Add 6-bit sums.
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* An alternative to the "return" statement above is:
|
|
|
|
|
return ((x * 0404040404) >> 26) + // Add 6-bit sums.
|
|
|
|
|
(x >> 30); |
|
|
|
|
which runs faster on most machines (suggested by Norbert Juffa). */ |
|
|
|
|
|
|
|
|
|
int pop3(unsigned x) { |
|
|
|
|
int pop3(unsigned x) |
|
|
|
|
{ |
|
|
|
|
unsigned n; |
|
|
|
|
|
|
|
|
|
n = (x >> 1) & 0x77777777; // Count bits in
|
|
|
|
@ -101,7 +106,8 @@ int pop5a(unsigned x) |
|
|
|
|
return sum; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int pop6(unsigned x) { // Table lookup.
|
|
|
|
|
int pop6(unsigned x) |
|
|
|
|
{ // Table lookup.
|
|
|
|
|
static char table[256] = { |
|
|
|
|
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, |
|
|
|
|
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, |
|
|
|
@ -130,7 +136,8 @@ int pop6(unsigned x) { // Table lookup. |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// The following works only for 8-bit quantities.
|
|
|
|
|
int pop7(unsigned x) { |
|
|
|
|
int pop7(unsigned x) |
|
|
|
|
{ |
|
|
|
|
x = x*0x08040201; // Make 4 copies.
|
|
|
|
|
x = x >> 3; // So next step hits proper bits.
|
|
|
|
|
x = x & 0x11111111; // Every 4th bit.
|
|
|
|
@ -140,7 +147,8 @@ int pop7(unsigned x) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// The following works only for 7-bit quantities.
|
|
|
|
|
int pop8(unsigned x) { |
|
|
|
|
int pop8(unsigned x) |
|
|
|
|
{ |
|
|
|
|
x = x*0x02040810; // Make 4 copies, left-adjusted.
|
|
|
|
|
x = x & 0x11111111; // Every 4th bit.
|
|
|
|
|
x = x*0x11111111; // Sum the digits (each 0 or 1).
|
|
|
|
@ -149,7 +157,8 @@ int pop8(unsigned x) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// The following works only for 15-bit quantities.
|
|
|
|
|
int pop9(unsigned x) { |
|
|
|
|
int pop9(unsigned x) |
|
|
|
|
{ |
|
|
|
|
unsigned long long y; |
|
|
|
|
y = x * 0x0002000400080010ULL; |
|
|
|
|
y = y & 0x1111111111111111ULL; |
|
|
|
@ -159,7 +168,8 @@ int pop9(unsigned x) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int errors; |
|
|
|
|
void error(int x, int y) { |
|
|
|
|
void error(int x, int y) |
|
|
|
|
{ |
|
|
|
|
errors = errors + 1; |
|
|
|
|
printf("Error for x = %08x, got %08x\n", x, y); |
|
|
|
|
} |
|
|
|
|