0 Pregunta: Los bits de inversión en un entero solo funcionan en patrones de bits simétricos

pregunta creada en Sun, Mar 17, 2019 12:00 AM

Tengo este simple bit de código (perdón por el juego de palabras) donde quiero invertir los bits en los enteros, pero solo hasta el más significativo, sin incluir el relleno.

El objetivo es tener este resultado:

0  => 0
1 => 1
10 => 01
1011 => 1101
111011 => 110111

No estoy buscando una inversión total de bytes como esta:

0000 00001 => 1000 0000 

Por lo tanto, el objetivo es solo invertir hasta el bit más significativo.

Aquí está mi código de prueba:

 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));

Las funciones:

    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);
        }
    }

Resultados de datos:

0 => 0  //correct
1 => 10 //should be 1
10 => 1 //correct
11 => 11 //correct
100 => 0 // should be 1
101 => 10 // should be 101

¿En qué me he equivocado?

    
0
  1. Sugerencia: ¿qué es Mathf.Log(6,2) y qué pensaste hacer con eso?
    2019-03-17 23: 04: 36Z
  2. Bueno, usé ceil to int para redondearlo a 3 bits, lo que supongo que era necesario. Dado que 6 es 110 solo necesito 3 bits para tratar.
    2019-03-17 23: 09: 44Z
  3. ¿Por qué tiene un parámetro de número de bits en primer lugar, si quiere determinar el tamaño de la salida del tamaño de cada entrada? Ahora mismo estás obligando a que todas tus entradas se inviertan como un grupo de 3 bits, pero de acuerdo con tu pregunta, no quieres eso.
    2019-03-17 23: 11: 17Z
  4. Simplemente cambie for (uint i = 0; i < numBits; i++) a 0600350991100101035062 y listo. Entonces puedes eliminar el segundo parámetro completamente; no es útil.
    2019-03-17 23: 12: 31Z
  5. Oh, creo que sé lo que quieres decir ahora, necesito realizar un registro (n, 2) para cada número en lugar de solo el número máximo. Edit2: espera, ¿quieres decir while (x) ya que x no es un bool?
    2019-03-17 23: 13: 00Z
0 Respuestas                              0                         
while (x > 0)
fuente colocada aquí