2011-09-07 9 views
16

Si tengo una notación binaria como "1000010", que es igual a 66 y quiero incrementarlo en uno de "1000011", que es igual a 67. ¿Cómo se hace eso correctamente en mi matriz? Actualmente está imprimiendo "0100010" que es 34, pero no está cerca de la respuesta correcta. No creo que mi matriz esté cambiando correctamente, ni aumentará el tamaño a medida que los números aumentan. Sin embargo, no puedo hacer ninguna suposición sobre qué tan grande puede ser la matriz más allá de lo que se establece explícitamente.¿Cómo incrementar los bits correctamente en una matriz?

public class math { 


//================================================================= 
    // increment(A) returns an array of bits representing A+1. 
    //================================================================= 

    public static byte[] increment(byte[] A) 
    { 
    byte carry= 1; 
    for(int i = 0; i<A.length; i++){ 
     byte b = A[i]; 
     A [i] ^= carry; 
     carry &= b; 
    } 
    return A; 
    } 

    private static String toBinString (byte [] a) 
    { 
     String res = ""; 
     for (int i = 0; i <a. length; i++) 
     { 
      res = (a [i] == 0 ? "0": "1") + res; 
     } 
     return res; 
} 


/** 
* @param args 
*/ 
public static void main(String[] args) { 
     byte [] A ={1,0,0,0,0,1,0}; 

     increment(A); 
      System.out.println (toBinString (A)); 


} 
} 
+0

relacionados: http://stackoverflow.com/questions/1034473/java-iterate-bits- en-matriz de bytes –

+3

en su declaración de a parece que quiere más a la izquierda (primera) serie sea el bit más significativo, en el resto del programa se tiene en cuenta el primer elemento de la matriz como el bit menos significativo. La solución más fácil sería ingresar su número en orden inverso en la matriz, o invertir la matriz ... – fvu

+0

Esta solución funcionó para mí: https://stackoverflow.com/questions/4421400/how-to-get-0- padded-binary-representation-of-a-integer-in-java – HoldOffHunger

Respuesta

4

Esto funcionó para mí:

public static void main(String[] args) { 
    byte [] A ={1,0,0,0,0,1,0}; 
    increment(A); 
    System.out.println (toBinString (A)); 
} 

public static byte[] increment(byte[] A) { 
    boolean carry = true; 
    for (int i = (A.length - 1); i >= 0; i--) { 
     if (carry) { 
      if (A[i] == 0) { 
       A[i] = 1; 
       carry = false; 
      } 
      else { 
       A[i] = 0; 
       carry = true; 
      } 
     } 
    } 

    return A; 
} 

private static String toBinString (byte [] a) { 
     String res = ""; 
     for (int i = 0; i < a. length; i++) { 
      res += (a [i] == 0 ? "0": "1") ; 
     } 
     return res; 
} 
0
public static byte[] increment(byte[] array) { 
    byte[] r = array.clone(); 
    for (int i = array.length - 1; i >= 0; i--) { 
     byte x = array[ i ]; 
     if (x == -1) 
      continue; 
     r[ i ] = (byte) (x + 1); 
     Arrays.fill(r, i + 1, array.length, (byte) 0); 
     return r; 
    } 
    throw new IllegalArgumentException(Arrays.toString(array)); 
} 

excepción si desbordamiento

4

La forma perezosa (y seguro) para la subasta por uno:

String s = "1000010"; 
    for (int i = 0; i < 5; i++) { 
     System.out.print(s); 
     System.out.println("\t" + Integer.valueOf(s, 2)); 
     s = Integer.toBinaryString(Integer.valueOf(s, 2) + 1); 
    } 

de salida:

1000010 66 
1000011 67 
1000100 68 
1000101 69 
1000110 70 

(Editado para la presentación)

+0

Esto no producirá resultados uniformes con números binarios de longitud variable. I.E., 1 sale como "1", 2 sale como "10", 4 sale como "100", etc. Funciona solo debido a los números específicos que está demostrando aquí. – HoldOffHunger

1
//Function call 
incrementCtr(ctr, ctr.length - 1); 

//Increments the last byte of the array 
private static void incrementCtr(byte[] ctr, int index) {  

    ctr[index]++; 

    //If byte = 0, it means I have a carry so I'll call 
    //function again with previous index 
    if(ctr[index] == 0) { 
     if(index != 0) 
      incrementCtr(ctr, index - 1); 
     else 
      return; 
    } 
} 
+0

¿Qué sucede cuando tienes un byte 0xFF? Parece que nuestro código no funcionará para un caso así –

1

tarde pero concisa:

public static void increment(byte[] a) { 
    for (int i = a.length - 1; i >= 0; --i) { 
     if (++a[i] != 0) { 
      return a; 
     } 
    } 
    throw new IllegalStateException("Counter overflow"); 
} 
Cuestiones relacionadas