2010-07-02 17 views
17

Por ejemplo, he el número binario 1011 que es igual a decimal 11. Quiero la ubicación del bit inverso de tal manera que se convierta en 1101, que es decimal 13. Aquí es código:los bits inversa en número

import java.util.*; 
public class bits { 
    public static void main(String[] args) { 
     Scanner scnr=new Scanner(System.in); 
     System.out.println("enter x:"); 
     int x=scnr.nextInt(); 
     int b=0; 
     while (x!=0){ 
      b|=(x &1); 
      x>>=1; 
      b<<=1; 
     } 
     System.out.println(b); 
    } 
} 

Pero cuando ingreso x 11, imprime 26. ¿Cuál es el error?

+1

un entero completo se puede invertir con 'Integer.reverse (int i)' - pero como parece que quieres invertir enteros con menos bits, lo dejo como un comentario. –

+0

parece que la solución ya está aquí: http://stackoverflow.com/questions/746171/best-algorithm-for-bit-reversal-from-msb-lsb-to-lsb-msb-in-c Estás falta que debe haber un cambio adicional necesario al final – AndrewB

Respuesta

23

Usted está cambiando b una vez más. Hacer el cambio primero (por lo que la primera vez, cuando b == 0, no tiene ningún efecto):

while (x!=0){ 
    b<<=1; 
    b|=(x &1); 
    x>>=1; 
} 
+0

gracias a Thomas mucho –

1

b se desplaza a la izquierda una vez con demasiada frecuencia. Espero que la entrada 1 dé como resultado la salida 2. Mueva la tecla Shift dos líneas hacia arriba.

1

has cambiado una vez demasiadas. intente cambiar b a la izquierda antes de hacer | =:

while (x!=0){ 
      b<<=1; 
      b|=(x &1); 
      x>>=1; 

     } 
    System.out.println(b); 
1

Te quedan desplazando b una vez más de lo requerido. Agregue b >>= 1 después de su ciclo while.

0

El resultado es el doble de lo esperado, por lo que la última operación de cambio a la izquierda (un cambio a la izquierda dobla el valor) es demasiado.

2
  1. >>>= uso en lugar de >>=
  2. Si desea cambiar el método de firma a public static byte reverse(byte in) esto no va a funcionar en valores negativos porque no hay conversión implícita a int.
0

Es seguro utilizar el operador de desplazamiento a la derecha sin signo (>>>) en el ciclo while para evitar el peligro de que se ejecute en un bucle infinito para -ve números.

while (x!=0){ 
    b<<=1; 
    b|=(x &1); 
    x>>>=1; 
} 
2

El programa no funcionan para la entrada como 1, 2

int reverseBits(int x) 
    { 
     int b = 0; 
     while (x != 0) 
     { 
      b <<= 1; 
      b |= (x & 1); 
      x >>= 1 
     } 
     return b; 
    } 

entrada 1 salida 1, debe ser de 8 ¿verdad? de entrada 2 de salida 1, debería ser 4.

1
while(x!=0){ 
    b<<=1; 
    b|=(x&1); 
    x>>=1; 
} 
2

Nota para principiantes: Consumo hexadecimal (0-9 y A-F) debido a que uno de mapas de dígito hexadecimal a 4 bits binarios perfectamente. En lugar de escribir 1010, utilizo A (10 decimal). Puede decirle a Java que use hexadecimales (literales) comenzando con 0x como en 0x0A.

Como se dijo anteriormente, 1 debe dar salida 8 (0001 a 1000). Entonces, en lugar de while (x! = 0), el código necesita desplazar el primer bit hasta la longitud de los bits necesarios en este ejemplo, es 4.

for (int i = 0; i < 4; ++i) { // not while (x!=0){ 
    b<<=1; 
    b|=(x &1); 
    x>>=1; 
} 
Hex convert 0-F: 0=0 1=8 2=4 3=C 4=2 5=A 6=6 7=E 8=1 9=9 A=5 B=D C=3 D=B E=7 F=F 

O llena el ejemplo 8 bits:

public static byte reverse(byte x) { 
    byte b = 0; 
    for (int i = 0; i < 8; ++i) { 
     b<<=1; 
     b|=(x &1); 
     x>>=1; 
     } 
    return b; 
} 
public static void main(String args[]) { 
    byte[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
      (byte) 0xAA, (byte) 0xFE, (byte) 0xFF }; 
    for (byte b : nums) { 
     System.out.printf("%02X=%02X ", b, reverse(b)); 
    } 
    System.out.println(); 
} 

Salida:

00=00 01=80 02=40 03=C0 04=20 05=A0 06=60 07=E0 08=10 
09=90 0A=50 0B=D0 0C=30 0D=B0 0E=70 0F=F0 10=08 11=88 AA=55 FE=7F FF=FF 
0

Mis nuevos bits de código java inversa en un entero usando Java con la manipulación de bits de gran alcance. Está trabajando con valores positivos, negativos y cero. Espero eso ayude.

public static int reverseDigits(int num) throws Exception { 
     if (num == 0) {   
      return Integer.MAX_VALUE | Integer.MIN_VALUE; 
     } 

     int count = Integer.SIZE * 8 - 1; 
     int reversed = num;   
     boolean positive = true; 

     if (num < 0) { 
      positive = false; 
     } 

     if (positive) num >>= 1; 

     while(num != 0) { 

      reversed <<= 1; 
      reversed |= (num & 1);   

      num >>>= 1; 
      count--;    
     } 

     if (positive) reversed <<= count; 
     return reversed; 
    } 

Puede representar bits de número entero con mi otra manipulación de bits de código en Java lo impresión de ceros a la izquierda: https://stackoverflow.com/a/39056535/6738542

Debido Integer.toBinaryString() ocultará los ceros a la izquierda.

Metal | ,, |

+0

mucho mejor si utiliza esta línea: booleano positivo = (num <0)? falso verdadero; y olvida la siguiente instrucción if. –

+0

"throws Exception" no es importante, solo lo usé para otras pruebas. –

+0

o 'boolean positive = num> = 0;' –

Cuestiones relacionadas