Question

Salut, je suis en train de créer une méthode qui prendra un certain nombre et l'imprimer ainsi que sa représentation binaire. Les problèmes est que ma méthode imprime tous les 0 pour un nombre positif, et les 1 est pour un numéro de négatif

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

        }

    }

Je l'ai: ce travaux:

/**
     * 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();
    }
Était-ce utile?

La solution

Vous avez oublié de mettre à jour le masque:

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

Autres conseils

Le texte de la question a été modifiée à plusieurs reprises, il est donc difficile de dire quelle est la question, mais voici quelques remarques.

Sur signé vs quart de travail non signé

Une révision de la question contient cette ligne:

int mask = 1 << 31;

Une réponse suggère que ce qui manquait est cette ligne:

mask = mask >> 1;

Cette réalité ne fonctionnera pas, parce que >> est un changement signé et entraînerait la valeur mask incorrecte à cet effet (puisque les bits vides sont remplis de 1s). Un nombre quelconque de négatif serait converti en 32 bits, tous 1.

Ce qui est nécessaire est le décalage droit non signé.

mask >>>= 1;

Notez que l'affectation composé a été utilisé par souci de concision. Unsigned remplissages droit de >>> de décalage des bits vidés avec 0. Tel qu'il est utilisé ici, il assure que mask aura toujours un seul bit, qui est ce qui est nécessaire pour ce problème.

Voir aussi

question similaires


solution alternative

Il est en fait une solution plus simple de convertir un int 32 bits en 32 bits, séparés en groupes 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]"

Même si cela devoirs, la variété des techniques utilisées ici devrait encore être d'instruction.

Voir aussi

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top