Domanda

Ciao io sono la creazione di un metodo che prendere un numero e stamparlo insieme con la sua rappresentazione binaria. Il problema è che il mio metodo di stampare tutti i 0 di per qualsiasi numero positivo, e di tutti i 1 di per qualsiasi numero 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(" ");

        }

    }

ho capito: questo funziona:

/**
     * 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();
    }
È stato utile?

Soluzione

Hai dimenticato di aggiornare la maschera:

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

Altri suggerimenti

Il testo della domanda è stato modificato numerose volte, quindi è difficile dire che cosa la domanda è, ma qui ci sono alcune osservazioni.

Il sottoscritto vs spostamento non firmato

Una revisione della questione contiene questa linea:

int mask = 1 << 31;

Una risposta suggerisce che quello che mancava è questa linea:

mask = mask >> 1;

Questo in realtà non funziona, perché >> è uno spostamento firmata e comporterebbe il valore mask corretto per questo scopo (dal bit vuoti sono riempiti con 1s). Qualsiasi numero negativo verrebbe convertito a 32 bit, tutti 1.

Ciò che serve è lo spostamento a destra senza segno.

mask >>>= 1;

Si noti che l'assegnazione composto è stato utilizzato per brevità. Destra senza segno riempimenti spostamento >>> svuotati bit con 0. Come usato qui, si assicura che mask avrà sempre un solo set bit, che è ciò che è richiesto per questo problema.

Vedi anche

interrogazione


Soluzione alternativa

C'è effettivamente una soluzione più semplice per convertire a 32 bit int in 32 bit, separati in gruppi di 4 bit.

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]"

Anche se questo è compiti a casa, la varietà di tecniche utilizzate qui dovrebbe essere ancora didattico.

Vedi anche

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top