Java stampare il numero binario utilizzando operatore bit per bit [chiusa]
-
03-10-2019 - |
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();
}
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 1
s). 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
- con Java
- Un simile compito a casa
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.