Hola estoy creando un método que va a tomar un número e imprimir junto con su representación binaria. El problemas es que mi método imprime todos 0 para cualquier número positivo, y todos los 1 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: esto funciona:

/**
     * 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();
    }
¿Cuál es la pregunta?

OriginalEl autor user69514 | 2010-05-06

2 Comentarios

  1. 5

    Usted se olvidó de 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;
        }
    Dependiendo del tipo de mask, el cambio debe estar sin firmar >>>.

    OriginalEl autor kgiannakakis

  2. 2

    El texto de la pregunta que ha sido modificada en numerosas ocasiones, así que es difícil decir cuál es la pregunta, pero aquí están algunos de los comentarios.

    Sobre firmado vs unsigned cambio

    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;

    Esto realmente no funciona, porque >> es una firma de turno, y el resultado sería la incorrecta mask valor para este propósito (desde vaciado están llenos de bits 1s). Cualquier número negativo sería convertida en 32 bits, todos los 1.

    Lo que se necesita es el unsigned mayús derecha.

    mask >>>= 1;

    Nota de que el compuesto de la asignación ha sido utilizado por razones de brevedad. Unsigned mayús derecha >>> llena vaciado bits con 0. Como se usa aquí, se asegura de que mask siempre tendrá sólo un conjunto de bits, que es lo que se requiere para este problema.

    Véase también

    Pregunta Similar


    Alternativa de solución

    De hecho, hay una solución más sencilla para convertir una de 32 bits int 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 esta es la tarea, la variedad de técnicas que se utilizan aquí todavía debe ser instructivo.

    Véase también

    OriginalEl autor polygenelubricants

Dejar respuesta

Please enter your comment!
Please enter your name here