У меня есть этот простой бит кода (простите за каламбур), где я хочу инвертировать биты в целых числах, но только до самых значительных - не включая отступы.
Цель состоит в том, чтобы получить такой же результат:
0 => 0
1 => 1
10 => 01
1011 => 1101
111011 => 110111
Я не ищу полное обращение байтов, как это:
0000 00001 => 1000 0000
Таким образом, цель - разворот только до самого значимого бита.
Вот мой тестовый код:
InitBitReversedIndices(6,Mathf.CeilToInt( Mathf.Log(6,2) ));
for (int i = 0; i < 6; i++)
Debug.Log(Convert.ToString(i, 2) + " => " + Convert.ToString(_reverseInts[i], 2));
Функции:
private uint BitReverse(uint x,int numBits)
{
uint y = 0;
for (uint i = 0; i < numBits; i++)
{
y <<= 1;
y |= x & 0x0001;
x >>= 1;
}
return y;
}
private void InitBitReversedIndices(int total, int log2N)
{
_reverseInts = new int[total];
int bits = log2N;
for (int i = 0; i < total; i++)
{
_reverseInts[i] = (int)BitReverse((uint)i, bits);
}
}
Результаты данных:
0 => 0 //correct
1 => 10 //should be 1
10 => 1 //correct
11 => 11 //correct
100 => 0 // should be 1
101 => 10 // should be 101
Где я ошибся?