#include <stdio.h>
unsigned compress_Harold(unsigned x, unsigned m)
{
unsigned r, s, b; // Result, shift, mask bit.
r = 0;
s = 0;
do {
b = m & 1;
r = r | ((x & b) << s);
s = s + b;
x = x >> 1;
m = m >> 1;
} while (m != 0);
return r;
}
unsigned compress(unsigned x)
{
int mask = 0xA9;
int mask1 = mask & 0xF0;
int mask2 = mask & 0x0F;
return (((x & mask1)*0x03000000 >> 28) & 0x0C) | ((x & mask2)*0x50000000 >> 30);
}
int main()
{
unsigned i;
for (i = 0; i < 256; ++i)
if (compress_Harold(i, 0xA9) != compress(i))
printf("Error at x = %d\n", i
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp1bnNpZ25lZCBjb21wcmVzc19IYXJvbGQodW5zaWduZWQgeCwgdW5zaWduZWQgbSkKewogICB1bnNpZ25lZCByLCBzLCBiOyAgICAvLyBSZXN1bHQsIHNoaWZ0LCBtYXNrIGJpdC4gCgogICByID0gMDsgCiAgIHMgPSAwOyAKICAgZG8gewogICAgICBiID0gbSAmIDE7IAogICAgICByID0gciB8ICgoeCAmIGIpIDw8IHMpOyAKICAgICAgcyA9IHMgKyBiOyAKICAgICAgeCA9IHggPj4gMTsgCiAgICAgIG0gPSBtID4+IDE7IAogICB9IHdoaWxlIChtICE9IDApOyAKICAgcmV0dXJuIHI7IAp9IAoKdW5zaWduZWQgY29tcHJlc3ModW5zaWduZWQgeCkKewoJaW50IG1hc2sgPSAweEE5OwoJaW50IG1hc2sxID0gbWFzayAmIDB4RjA7CglpbnQgbWFzazIgPSBtYXNrICYgMHgwRjsKCXJldHVybiAoKCh4ICYgbWFzazEpKjB4MDMwMDAwMDAgPj4gMjgpICYgMHgwQykgfCAoKHggJiBtYXNrMikqMHg1MDAwMDAwMCA+PiAzMCk7Cn0KCmludCBtYWluKCkKewoJdW5zaWduZWQgaTsKCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKCQlpZiAoY29tcHJlc3NfSGFyb2xkKGksIDB4QTkpICE9IGNvbXByZXNzKGkpKQoJCQlwcmludGYoIkVycm9yIGF0IHggPSAlZFxuIiwgaSk7CglwcmludGYoIkZpbmlzaGVkXG4iKTsKCQoJcmV0dXJuIDA7Cn0K