Frage

Hallo ich eine Methode erschaffe, die eine Reihe nehmen und drucken Sie es mit seiner binären Darstellung zusammen. Die Probleme ist, dass meine Methode druckt alle 0 für jede positive Zahl, und alle 1 für jede negative Zahl

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(" ");

        }

    }

Ich habe es: das funktioniert:

/**
     * 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();
    }
War es hilfreich?

Lösung

Sie haben vergessen, die Maske zu aktualisieren:

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

Andere Tipps

Der Text der Frage mehrmals bearbeitet wurde, so ist es schwer zu sagen, was die Frage ist, aber hier sind einige Bemerkungen.

Auf vs unsigned Verschiebung unterzeichnet

Eine Revision der Frage enthält die folgende Zeile:

int mask = 1 << 31;

Eine Antwort deutet darauf hin, dass das, was fehlte diese Zeile:

mask = mask >> 1;

Dies wird tatsächlich nicht arbeiten, weil >> ist ein signiertes Verschiebung und in der falschen mask Wert zu diesem Zweck führen würde (da entleerte Bits mit 1s gefüllt sind). Jede negative Zahl würde auf 32 Bit umgewandelt werden, die alle 1.

Was benötigt wird, ist die unsigned Verschiebung nach rechts.

mask >>>= 1;

Beachten Sie, dass die Verbindung Zuordnung wurde der Kürze halber verwendet. Vorzeichenlose Rechtsverschiebung >>> Füllungen geleert Bits mit 0. Wie hier verwendet wird, ist sichergestellt, dass mask immer nur ein Bit gesetzt wird, das ist es, was für dieses Problem erforderlich ist.

Siehe auch

ähnliche Frage


Alternative Lösung

Es gibt tatsächlich eine einfachere Lösung, die einen 32-Bit-int in 32 Bits zu konvertieren, getrennt in Gruppen von 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]"

Auch wenn diese Hausaufgaben ist, verwendet die Vielfalt der Techniken, die hier sollte noch Lehr sein.

Siehe auch

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top