2011-11-16 30 views
11

Estoy tratando de convertir un número entero en una matriz binaria Booleana de 7 bits. Hasta ahora el código no funciona: Si ingreso un entero 8 para convertir, en lugar de 0001000 obtengo 1000000, o digo 15 debería obtener 0001111 pero obtengo 1111000. La matriz de caracteres tiene una longitud diferente a la matriz binaria y las posiciones son incorrectasEntero a matriz binaria

public static void main(String[] args){ 

    String maxAmpStr = Integer.toBinaryString(8); 
    char[] arr = maxAmpStr.toCharArray(); 
    boolean[] binaryarray = new boolean[7]; 
    for (int i=0; i<maxAmpStr.length(); i++){ 
     if (arr[i] == '1'){    
      binaryarray[i] = true; 
     } 
     else if (arr[i] == '0'){ 
      binaryarray[i] = false; 
     } 
    } 

    System.out.println(maxAmpStr); 
    System.out.println(binaryarray[0]); 
    System.out.println(binaryarray[1]); 
    System.out.println(binaryarray[2]); 
    System.out.println(binaryarray[3]); 
    System.out.println(binaryarray[4]); 
    System.out.println(binaryarray[5]); 
    System.out.println(binaryarray[6]); 
} 

Cualquier ayuda es apreciada.

+1

¿Es la tarea? Usa división y resto por 2. – kan

+0

¿Has intentado recorrer tu código, ya sea a mano o con un depurador? Ninguno de los dos debería ser un desafío si usa '8' como entrada y le permitirá ver dónde su resultado comienza a desviarse de la corrección. –

Respuesta

1

La matriz de caracteres es tan larga como sea necesario, por lo que su matriz booleana puede ser más larga y colocar los bits en la posición incorrecta. Así que empiece desde atrás, y cuando termine su matriz char, llene su matriz booleana con 0 hasta la primera posición.

2

Consejos: Piense en lo que sucede cuando obtiene una representación de caracteres de menos de siete caracteres.

En particular, piense cómo las matrices char[] y boolean[] "alinean"; habrá elementos adicionales en uno que el otro, entonces, ¿cómo deberían coincidir los índices?


respuesta real: En estos momentos se está utilizando el primer elemento de la matriz de caracteres como el primer elemento de la matriz booleana, que sólo es correcta cuando se está utilizando una cadena de siete caracteres. De hecho, desea que los últimos elementos de las matrices coincidan (para que los ceros estén acolchados en la parte delantera, no al final).

Una forma de abordar este problema sería jugar con los índices dentro del ciclo (por ejemplo, resolver la diferencia de tamaño y modificar binaryarray[i + offset]). Pero una solución aún más simple es simplemente dejar la cadena con ceros después de la primera línea, para asegurar que sean exactamente siete caracteres antes de convertirla a la matriz de caracteres.

(Marcas adicionales: ¿qué haces cuando hay más de 7 caracteres en la matriz, por ejemplo, si alguien pasa 200 como argumento? En función de las dos soluciones anteriores, deberías poder detectar este caso fácilmente y manejarlo específicamente .)

3

lo que se obtiene cuando se hace System.out.println(maxAmpStr); es "1000" en el caso de la 8. por lo tanto, usted consigue solamente la parte pertinente, el primer "0000" que esperado es simplemente omitido. No

for (int i=0; i<maxAmpStr.length(); i++) 
{ 
    if (arr[i] == '1') 
    { 
     binaryarray[i+maxAmpStr.length()-1] = true; 
    } 
    else if (arr[i] == '0') 
    { 
     binaryarray[i+maxAmpStr.length()-1] = false; 
    } 
} 
0

Integer.toBinaryString(int i) no pad:

No es bonito, pero lo que podría hacer es. Por ej. Integer.toBinaryString(7) imprime 111 no 00000111 como era de esperar. Debe tener esto en cuenta cuando decida dónde comenzar a poblar su matriz booleana.

+0

Incluso si 'toBinaryString' imprimió' 00000111', este programa aún sería incorrecto ya que los índices aún no se alinearían entre las matrices char y boolean. (De hecho, fallaría con una excepción IndexOutOfBoundsException, aunque podría ser trivialmente corregida para dejar el problema subyacente.) –

24

En realidad no hay necesidad de tratar con cadenas para ello, basta con hacer comparaciones a nivel de bits de los 7 bits que le interesan.

public static void main(String[] args) { 

    int input = 15; 

    boolean[] bits = new boolean[7]; 
    for (int i = 6; i >= 0; i--) { 
     bits[i] = (input & (1 << i)) != 0; 
    } 

    System.out.println(input + " = " + Arrays.toString(bits)); 
} 
+4

+1 por ser un ejemplo tan conciso pero su respuesta podría hacer una explicación de por qué el OP no funciona. – Radiodef

+0

Bueno, estoy interesado en más de 200 bits, por lo que esta solución no funciona. ¿Puedes dar un consejo? ¿Hay alguna manera de trabajar con 'boolean []' ('bits') o debería probar' Strings'? –

0

15.ToBinaryString será '1111'

Estás cortando el primero al último carácter, por lo que el primer '1' que es el bit (3) va a binaryArray [0], y asumo que debe ser el bit 0.

lo que ned toBinaryString almohadilla con ceros a la izquierda hasta una longitud de 7 (8 ??) y luego revertir la cadena, (o su bucle)

O usted podría dejar de perder el tiempo con cadenas y simplemente utilizar bits operadores prudentes

BinaryArray [3] = (someInt & & 2^3 = 0!);

^= operador de potencia o si no (1 < < 3) o lo que queda turno en Java.

11

me gustaría utilizar esto:

private static boolean[] toBinary(int number, int base) { 
    final boolean[] ret = new boolean[base]; 
    for (int i = 0; i < base; i++) { 
     ret[base - 1 - i] = (1 << i & number) != 0; 
    } 
    return ret; 
} 

número 15 con la base 7 producirá {false, falso, falso, cierto, cierto, cierto, true} = 0001111b

número 8, la base 7 { falso, falso, falso, verdadero, falso, falso, falsa} = 0001000b

+5

El uso de 'base' aquí es un poco engañoso, ya que el binario siempre es la base 2. Quizás' length' sería más apropiado. De hecho, puede calcular 'length' como el logaritmo de base-2 de' number'. – Martijn

-1
public static String intToBinary(int num) { 
    int copy = num; 
    String sb = ""; 
    for(int i=30; i>=0; i--) { 
     sb = (copy&1) + sb; 
     copy = copy >>>=1; 
    } 
    return sb; 
} 
  1. y el número con 1
  2. Anexar el valle a una cadena
  3. hacer sin firmar desplazamiento a la derecha repita los pasos 1-3 para i = 30..0
0
public static boolean[] convertToBinary(int b){ 
    boolean[] binArray = new boolean[7]; 
    boolean bin; 
    for(int i = 6; i >= 0; i--) { 
     if (b%2 == 1) bin = true; 
     else bin = false; 
     binArray[i] = bin; 
     b/=2; 
    } 
    return binArray; 
    } 
-1
String maxAmpStr = Integer.toBinaryString(255); 
    char[] arr = maxAmpStr.toCharArray(); 
    boolean[] binaryarray = new boolean[20]; 
    int pivot = binaryarray.length - arr.length; 
    int j = binaryarray.length - 1; 
    for (int i = arr.length - 1; i >= 0; i--) { 
     if (arr[i] == '1') { 
      binaryarray[j] = true; 
     } else if (arr[i] == '0') { 
      binaryarray[j] = false; 
     } 
     if (j >= pivot) 
      j--; 
    } 

    System.out.println(maxAmpStr); 
    for (int k = 0; k < binaryarray.length; k++) 
     System.out.println(binaryarray[k]); 
} 
+1

será bueno si puede seguir explicando de qué se trata ese fragmento de código, que llevaría a una mejor comprensión para los futuros espectadores. – Roylee

0

Desde aquí nadie tiene una respuesta con una matriz dinámica longitud, aquí está mi solución:

public static boolean[] convertToBinary(int number) { 
    int binExpo = 0; 
    int bin = 1; 
    while(bin < number) { //calculates the needed digits 
     bin = bin*2; 
     binExpo++; 
    } 
    bin = bin/2; 
    boolean[] binary = new boolean[binExpo]; //array with the right length 
    binExpo--; 
    while(binExpo>=0) { 
     if(bin<=number) { 
      binary[binExpo] = true; 
      number =number -bin; 
      bin = bin/2; 
     }else { 
      binary[binExpo] = false; 
     } 
     binExpo--; 
    } 
    return binary; 
} 
Cuestiones relacionadas