Decimale a binario conversione
-
08-10-2019 - |
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.
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 sulnumber
(ricordiamo che Java passa i parametri per valore). - Shift è più efficiente di divisione (
number >>>= 1
invece dinumber /= 2
), anche se il compilatore dovrebbe essere in grado di ottimizzare questo comunque - È possibile evitare il modulo in
decToBin
se lo faretearray[k] = number & 1;
- Mentre si è in esso, perché non chiamare
getBinArray
dadecToBin
direttamente? Poi si può chiamaredecToBin
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 unint[]
. Nel codice corrente è necessario menzionare il12
due volte, il che è male. - Si dovrebbe utilizzare un ciclo
do { ... } while (number != 0)
. Altrimenti il ??numero0
sarà rappresentato da un array vuoto. - Si consiglia di utilizzare
x >>> 1
invece dix / 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 chebinToDec(decToBin(12, ...)) == 12
. - Il metodo
getBinArray
non dovrebbe esserepublic
, in quanto è solo un metodo di supporto. Si sia possibile sostituire ilpublic
conprivate
o semplicemente rimuovere ilpublic
.