Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [Java] convertire un numero binario in un long

    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

  2. #2
    Ho risolto.
    Posto anche come ho fatto magari interessasse a qualcuno:

    Codice PHP:
    public static long getLongToBitSequence(int[] bitsequence){
       
    String temp "";
       
    int count 0;
       
    int col 7
       long row 
    0L;
       
       for(
    int i bitsequence.length-1>= 0i--){
           
    temp += bitsequence[i];
           if(
    count == 7){
              
    long tmp Long.parseLong(temp2);
              
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.