Реверсирование битов в целых числах работает только на симметричных битовых комбинациях - PullRequest
0 голосов
/ 18 марта 2019

У меня есть этот простой бит кода (простите за каламбур), где я хочу инвертировать биты в целых числах, но только до самых значительных - не включая отступы.

Цель состоит в том, чтобы получить такой же результат:

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

Где я ошибся?

...