Java imprimer nombre binaire utilisant l'opérateur bit à bit [fermé]
-
03-10-2019 - |
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();
}
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 1
s). 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
- avec java
- Une mission de devoirs 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.