#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;
}