2010-03-25 18 views
5

Estoy intentando hacer la inversión de bit en un byte. Yo uso el siguiente códigoReversión de bits usando bitwise

static int BitReversal(int n) 
{ 
    int u0 = 0x55555555; // 01010101010101010101010101010101 
    int u1 = 0x33333333; // 00110011001100110011001100110011 
    int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111 
    int u3 = 0x00FF00FF; // 00000000111111110000000011111111 
    int u4 = 0x0000FFFF; 
    int x, y, z; 
    x = n; 
    y = (x >> 1) & u0; 
    z = (x & u0) << 1; 
    x = y | z; 

    y = (x >> 2) & u1; 
    z = (x & u1) << 2; 
    x = y | z; 

    y = (x >> 4) & u2; 
    z = (x & u2) << 4; 
    x = y | z; 

    y = (x >> 8) & u3; 
    z = (x & u3) << 8; 
    x = y | z; 

    y = (x >> 16) & u4; 
    z = (x & u4) << 16; 
    x = y | z; 

    return x; 
} 

Puede inversor de la broca (en una máquina de 32 bits), pero hay un problema, Por ejemplo, la entrada es 10001111101, quiero conseguir 10111110001, pero este método revertiría todo el byte, incluido el título 0s. La salida es 10111110001000000000000000000000. ¿Hay algún método para invertir solo el número real? No quiero convertirlo en cadena e inversor, luego convertir de nuevo. ¿Hay algún método matemático puro o método de operación de bits?

Best Regards,

+0

A pesar de que entiendo su método: no se puede compilar ya que usa u4 y no lo ha definido en su ejemplo. –

+0

Agregar int u4 = 0x0000FFFF; – user287792

+0

Esta no es la razón, solo lo extraño. –

Respuesta

1

forma Cheesy es cambiar hasta que obtenga un 1 a la derecha:

if (x != 0) { 
    while ((x & 1) == 0) { 
     x >>= 1; 
    } 
} 

Nota: Usted debe cambiar todas las variables a unsigned int. Como está escrito, puede tener extensiones de letreros no deseados cada vez que haga un cambio a la derecha.

+0

Debe comprobar si el valor insertado es cero, porque puede terminar con un bucle infinito. –

+0

Y esté atento a lo que hace el bit de signo en un cambio a la derecha con signo, su implementación está definida. Probablemente lo correcto es que el código del autor de la pregunta cambie a usar unsigned int: no hay ninguna razón para que se firme y no vale la pena la molestia. –

4

Obtener el número de bits más alta usando un enfoque similar y desplazar los bits resultantes a la derecha 33 - #bits y listo!

0

Un método podría ser encontrar el número inicial de bits de signo en el número n, desplazar a la izquierda n en ese número y luego ejecutarlo a través del algoritmo anterior.

+0

Esto es incorrecto: 1000 (bit alto 3) se convierte en << 3 y por lo tanto 10000000 y en reversa esto es 0x02000000, ¡y no 1! –

+0

@Ritsaert: 1000 tiene 24 bits de signo principales, por lo que debe cambiarlo 24, no 3 –

0

Suponiendo que todos los 32 bits son significativos y revirtiendo todo. Usted PODRÍA tratar de hacer que adivine el número de bits significativos encontrando el más alto 1, pero eso no es necesariamente exacto, así que le sugiero que modifique la función, de modo que se necesita un segundo parámetro que indique el número de bits significativos. Luego, después de invertir los bits, muévalos hacia la derecha.

0

Pruebe usar Integer.reverse (int x);