private static int Reverse(int i)
{
i = (i & 0x55555555) << 1 | (int)((uint)i >> 1) & 0x55555555;
i = (i & 0x33333333) << 2 | (int)((uint)i >> 2) & 0x33333333;
i = (i & 0x0f0f0f0f) << 4 | (int)((uint)i >> 4) & 0x0f0f0f0f;
i = (i << 24) | ((i & 0xff00) << 8) |
((int)((uint)i >> 8) & 0xff00) | (int)((uint)i >> 24);
return i;
}