#include <iostream>
#include <iomanip>
using namespace std;
static unsigned short * lookup = NULL;
void t1_init()
{
lookup = new unsigned short [1 << 16];
for (int i = 0; i < 1 << 16; ++i)
lookup[i] =
((i & 0xf000) ? 0 : 0xf000) |
((i & 0xf00) ? 0 : 0xf00) |
((i & 0xf0) ? 0 : 0xf0) |
((i & 0xf) ? 0 : 0xf);
}
unsigned int transform1(unsigned int value)
{
return
(lookup[((value >> 0 ) & 0xFFFF)] << 0 ) |
(lookup[((value >> 16) & 0xFFFF)] << 16);
}
unsigned int transform2(unsigned int hexval)
{
return
((hexval & 0xf0000000) ? 0 : 0xf0000000) |
((hexval & 0xf000000) ? 0 : 0xf000000) |
((hexval & 0xf00000) ? 0 : 0xf00000) |
((hexval & 0xf0000) ? 0 : 0xf0000) |
((hexval & 0xf000) ? 0 : 0xf000) |
((hexval & 0xf00) ? 0 : 0xf00) |
((hexval & 0xf0) ? 0 : 0xf0) |
((hexval & 0xf) ? 0 : 0xf);
}
unsigned int transform3(unsigned int n)
{
return ~(n | ((n & 0x77777777) << 1) | ((n & 0x88888888) >> 3)
| ((n & 0x33333333) << 2) | ((n & 0xCCCCCCCC) >> 2)
| ((n & 0x11111111) << 3) | ((n & 0xEEEEEEEE) >> 1));
}
unsigned int transform4(unsigned int in) {
return (
((in & (0xF << 28)) ? 0x0 : (0xF << 28)) |
((in & (0xF << 24)) ? 0x0 : (0xF << 24)) |
((in & (0xF << 20)) ? 0x0 : (0xF << 20)) |
((in & (0xF << 16)) ? 0x0 : (0xF << 16)) |
((in & (0xF << 12)) ? 0x0 : (0xF << 12)) |
((in & (0xF << 8)) ? 0x0 : (0xF << 8)) |
((in & (0xF << 4)) ? 0x0 : (0xF << 4)) |
((in & (0xF << 0)) ? 0x0 : (0xF << 0))
);
}
int main(int c, char * v[])
{
t1_init();
int i, j = 0x34005600, k, l;
bool testing = false;
unsigned int(* transform)(unsigned int) = transform4;
unsigned int(* transform_compare)(unsigned int) = transform4;
if (testing)
for (i = 0; i < 1000; ++i)
{
l = j;
k = transform_compare(j & i);
j = transform(j & i);
if (j != k)
cout << "Differing value: " <<
setfill('0') << setw(8) << hex << (l & i) << " -> " <<
setfill('0') << setw(8) << hex << j << ":" <<
setfill('0') << setw(8) << hex << k << endl;
}
else
for (i = 0; i < 10000000; ++i)
{
j = transform(j & i);
j = transform(j & i);
j = transform(j & i);
j = transform(j & i);
j = transform(j & i);
j = transform(j & i);
j = transform(j & i);
j = transform(j & i);
j = transform(j & i);
j = transform(j & i);
}
return j & 0xFFFFFF00;
}