PDA

Visualizza la versione completa : [Java] convertire un numero binario in un long


Marcoski
20-05-2004, 13:10
Ciao ragazzi,
Ho un problema un po' del cavolo.
In pratica devo convertire un numero binario di al masimo 64bit in un long usando java.
Il metodo che implemento prende un array di int che contiene 64 valori impostati a 1 o a 0 (in pratica il numero binario).
Lo converto in una stringa e lo passo in pasto a Long.parseLong(string, 2).
In teoria dovrebbe funzionare, ma in pratica per i numeri il cui 63° bit è impostato a 1 la JVM gentilmente mi rimanda un NumberFormatException.

Visto che i long sono solo con segno e che il 63° bit corrisponde al bit di segno non capisco perchè lo considera un numero senza segno.

Come posso risolvere questo problema?
Ciao

Marcoski
20-05-2004, 14:30
Ho risolto.
Posto anche come ho fatto magari interessasse a qualcuno:



public static long getLongToBitSequence(int[] bitsequence){
String temp = "";
int count = 0;
int col = 7
long row = 0L;

for(int i = bitsequence.length-1; i >= 0; i--){
temp += bitsequence[i];
if(count == 7){
long tmp = Long.parseLong(temp, 2);
tmp = tmp << (col*8);
row |= tmp;
count = 0;
col--;
}else{
count++;
}
}

return row;
}


In pratica lavoro su 64bit come se avessi una matrice 8x8 infatti ho un contatore di riga (count) e uno di colonna (col).
Ogni volta che una riga finisce (count == 7) allora mi creo il long a partire dalla sequenza di 8 bit. A questo punto per mettere gli 8bit nella posizione giusta sui 64bit faccio uno schift per il valore della colonna * 8 (ho 8 bit per colonna) quindi faccio un or logico con la variabile che mi tiene il valore finale in modo da non perdere lavecchia informazione.
In questo modo non ho più il problema del segno perchè lavorando direttamente su un valore long legale lo shift mi produce un long negativo se il 63° bit è affermato.

NB l'array viene scansionato al contrario perchè il 63° bit cioè il primo bit a partire da sinistra è in indice 63 sull'array.

NNB La scelta di scorrere l'array al contrario è solamente una convenzione non succede nulla se si scorre l'array in avanti basta solo stare attenti a utilizzare il giusto valore di col per lo shift.

Ciao

Loading