Pregunta

Hola Estoy creando un método que va a tomar un número e imprimirlo junto con su representación binaria. Los problemas es que mi método imprime los 0 para cualquier número de positivos, y los 1 de para cualquier número negativo

private static void display( int number ){

        System.out.print(number + "\t");        
        int mask = 1 << 31;

        for(int i=1; i<=32; i++) {
            if( (mask & number) != 0 )
                System.out.print(1);
            else
                System.out.print(0);


            if( (i % 4) == 0 )
                System.out.print(" ");

        }

    }

Lo tengo: funciona esto:

/**
     * prints the 32-bit binary representation of a number
     * @param number the number to print
     */
    private static void display( int number ){
        //display number and a tab
        System.out.print(number + "\t");

        //shift number 31 bits left
        int mask = 1 << 31;

        //loop and print either 1 or 0
        for(int i=31; i>=0; i--) {
            if( ((1 << i)&number) != 0)
                System.out.print(1);
            else
                System.out.print(0);

            //every four bits print a space
            if( (i % 4) == 0 )
                System.out.print(" ");            

        }
        //print new line
        System.out.println();
    }
¿Fue útil?

Solución

Se le olvidó actualizar la máscara:

    for(int i=1; i<=32; i++) {
        if( (mask & number) != 0 )
            System.out.print(1);
        else
            System.out.print(0);


        if( (i % 4) == 0 )
            System.out.print(" ");

        mask = mask >> 1;
    }

Otros consejos

El texto de la pregunta ha sido editada en numerosas ocasiones, por lo que es difícil decir cuál es la pregunta, pero aquí hay algunas observaciones.

En firmado vs desplazamiento sin signo

Una revisión de la cuestión contiene esta línea:

int mask = 1 << 31;

Una respuesta sugiere que lo que faltaba es esta línea:

mask = mask >> 1;

En realidad, esto no va a funcionar, porque es un cambio >> firmado, y daría como resultado el valor mask incorrecto para este fin (ya que los bits vacíos se llenan de 1s). Cualquier número negativo sería convertida a 32 bits, todos 1.

Lo que se necesita es el desplazamiento sin signo correcto.

mask >>>= 1;

Tenga en cuenta que la asignación compuesto ha sido utilizado por brevedad. Sin firmar derecha rellenos cambio >>> vaciaron los bits con 0. Tal como se utiliza aquí, se asegura que mask siempre tendrá un solo bit, que es lo que se requiere para este problema.

Ver también

pregunta similares


solución alternativa

De hecho, hay una solución más simple para convertir un int 32 bits en 32 bits, separados en grupos de 4 bits.

static String zeroes(int length) {
    return (length <= 0) ? ""
      : String.format("%0" + length + "d", 0);
}
//...

int num = 8675309;

// convert to binary
String s = Integer.toBinaryString(num);
System.out.println(s);
// prints "100001000101111111101101"

// fill in leading zeroes
s = zeroes(Integer.SIZE - s.length()) + s;
System.out.println(s);
// prints "00000000100001000101111111101101"

s = s.replaceAll("(?!$)(?<=\\G.{4})", " ");
System.out.println("[" + s + "]");
// prints "[0000 0000 1000 0100 0101 1111 1110 1101]"

Incluso si se trata de la tarea, la variedad de técnicas que se utilizan aquí debe seguir siendo de instrucción.

Ver también

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top