Domanda

voglio convertire i numeri decimali in numeri binari. Voglio memorizzarli in un array. Prima ho bisogno di creare una matrice che ha una certa lunghezza in modo che possa memorizzare i numeri binari. Dopo di che ho eseguire la conversione, ecco come lo faccio:

public class Aufg3 {
    public static void main(String[] args) {
        int[] test = decToBin(12, getBinArray(12));
        for(int i = 0; i < test.length; i++){
            System.out.println(test[i]);
        }
    }

    public static int[] getBinArray(int number){
        int res = number, length = 0;
        while(res != 0){        
            res /= 2;
                    length++;
        }
        return new int[length];
    }

    public static int[] decToBin(int number, int[] array){
        int res = number, k = array.length-1;
        while(res != 0){
            if(res%2 == 0){
                array[k] = 0;
            }else{
                array[k] = 1;
            }
            k--;
            res /= 2;
        }
        return array;
    }
}

C'è qualcosa da migliorare? Si deve stampare 1100 per l'ingresso di 12.

È stato utile?

Soluzione

suppongo si desidera scrivere il proprio codice - altrimenti questo è semplice da fare usando metodi dalla libreria standard di Java

.

Alcuni commenti rapidi:

  • Si può sbarazzarsi del res temperatura vars. Il lavoro direttamente sul number (ricordiamo che Java passa i parametri per valore).
  • Shift è più efficiente di divisione (number >>>= 1 invece di number /= 2), anche se il compilatore dovrebbe essere in grado di ottimizzare questo comunque
  • È possibile evitare il modulo in decToBin se lo farete array[k] = number & 1;
  • Mentre si è in esso, perché non chiamare getBinArray da decToBin direttamente? Poi si può chiamare decToBin con un solo ARG -. Il valore da convertire

Ecco una versione leggermente ottimizzata del codice:

public static int[] getBinArray(int number) {
    int length = 0;
    while (number != 0) {
        number >>>= 1;
        length++;
    }
    return new int[length];
}

public static int[] decToBin(int number) {
    int[] array = getBinArray(number);
    int k = array.length-1;
    while (number != 0)
    {
        array[k--] = number & 1;
        number >>>= 1;
    }
    return array;
}

Altri suggerimenti

Perché non usare il toBinaryString il metodo della classe Integer:

System.out.println(Integer.toBinaryString(12))

Se questo non è lavoro, non c'è bisogno di farlo da soli. Il seguente codice dovrebbe funzionare:

BigInteger bigInt = new BigInteger(number);
String asString = bigInt.toString(2);

Ci potrebbero essere modi più efficienti, ma questo è certamente molto leggibile e mantenibile.

Ci sono alcune piccole cose che si possono migliorare:

  • È necessario definire un metodo di "alto livello" che converte un int a un int[]. Nel codice corrente è necessario menzionare il 12 due volte, il che è male.
  • Si dovrebbe utilizzare un ciclo do { ... } while (number != 0). Altrimenti il ??numero 0 sarà rappresentato da un array vuoto.
  • Si consiglia di utilizzare x >>> 1 invece di x / 2, dal momento che le maniglie numeri negativi correttamente.
  • Se si desidera controllare che il codice è corretto, scrivere un altro metodo che riconverte da binario a int. Poi si può verificare che binToDec(decToBin(12, ...)) == 12.
  • Il metodo getBinArray non dovrebbe essere public, in quanto è solo un metodo di supporto. Si sia possibile sostituire il public con private o semplicemente rimuovere il public.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top