Java imprimir el número binario utilizando el operador bit a bit [cerrada]
-
03-10-2019 - |
Pregunta
Hola Estoy creando un método que va a tomar un número e imprimirlo junto con su representación binaria. Los problemas es que mi método imprime los 0 para cualquier número de positivos, y los 1 de para cualquier número 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(" ");
}
}
Lo tengo: funciona esto:
/**
* 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();
}
Solución
Se le olvidó actualizar la máscara:
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;
}
Otros consejos
El texto de la pregunta ha sido editada en numerosas ocasiones, por lo que es difícil decir cuál es la pregunta, pero aquí hay algunas observaciones.
En firmado vs desplazamiento sin signo
Una revisión de la cuestión contiene esta línea:
int mask = 1 << 31;
Una respuesta sugiere que lo que faltaba es esta línea:
mask = mask >> 1;
En realidad, esto no va a funcionar, porque es un cambio >>
firmado, y daría como resultado el valor mask
incorrecto para este fin (ya que los bits vacíos se llenan de 1
s). Cualquier número negativo sería convertida a 32 bits, todos 1
.
Lo que se necesita es el desplazamiento sin signo correcto.
mask >>>= 1;
Tenga en cuenta que la asignación compuesto ha sido utilizado por brevedad. Sin firmar derecha rellenos cambio >>>
vaciaron los bits con 0
. Tal como se utiliza aquí, se asegura que mask
siempre tendrá un solo bit, que es lo que se requiere para este problema.
Ver también
pregunta similares
- con Java
- Una asignación de tareas similares
solución alternativa
De hecho, hay una solución más simple para convertir un int
32 bits en 32 bits, separados en grupos 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]"
Incluso si se trata de la tarea, la variedad de técnicas que se utilizan aquí debe seguir siendo de instrucción.