#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);
	printf("Finished\n");
	
	return 0;
}
