private uint Take31Bits(uint[] data, int index)
{
ulong l2 = 0;
int off = (index%32);
int pointer = index >> 5;
ulong l1 = data[pointer];
pointer++;
if (pointer < data.Length)
l2 = data[pointer];
ulong l = (l1 << 32) + l2;
ulong ret = (l >> (33 - off)) & 0x7fffffff;
return (uint) ret;
}