Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    16

    Convertire 64bits in un long

    Salve a tutti di nuovo,

    vi pongo qui di seguito un quesito molto intrigante.
    Supponiamo di avere 64 bits, che in questo caso sono ordinati in un array 8x8, ma potrebbero essere ordinati anche tutti di seguito.
    codice:
    int[][] tMat1 = { {1, 0, 0, 0, 0, 0, 0, 0},
    				{0, 0, 0, 0, 0, 0, 0, 0},
    				{0, 0, 0, 0, 0, 0, 0, 0},
    				{0, 0, 0, 0, 0, 0, 0, 0},
    				{0, 0, 0, 0, 0, 0, 0, 0},
    				{0, 0, 0, 0, 0, 0, 0, 0},
    				{0, 0, 0, 0, 0, 0, 0, 0},
    				{0, 0, 0, 0, 0, 0, 0, 0}};
    Dato che i bits sono 64, voglio convertirli in un solo numero di tipo long dato che long è costituito da 64 bits.

    Quindi uso il seguente codice per fare la conversione.
    codice:
    	long nuovoNumero = 0;
    		long potenzaDi2 = 1;
    		for (int i = tMat1.length - 1; i >= 0; i--) {
    			for (int j = tMat1[0].length - 1; j >= 0; j--) {
    				System.out.println("power is " + power2);
    				nuovoNumero += potenzaDi2 * tMat1[i][j];
    				potenzaDi2 *= 2;
    				
    			}
    		}
    Tuttavia potenzaDi2 a un certo punto avrà un valore di -9223372036854775808, che è anche il tetto massimo per long. Quindi considerando l'esempio precedente quando c'è un 1 nella posizione più significative, long avrà già raggiunto il massimo consentito e l'aggiunta di altri 1 non influenzeranno il valore di long.

    Qualcuno ha qualche altra e migliore soluzione da proporre?

    Grazie in anticipo.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Allora, innanzitutto se il primo bit (quello più significativo) è 1, il numero rappresentato è negativo. Il primo bit è per il segno... a parte la considerazione signed, unsigned.

    Ad ogni modo, un metodo potrebbe essere quello di costruire una stringa contenente la serie di 1 e 0 della matrice, quindi usare Long.parseLong(String val, int radix) per effettuare la conversione:

    codice:
    String s = "10101011100001001100....";
    long valore = Long.parseLong(s, 2);
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    16
    è possibile avere due long per rappresentare tutti i numeri, anche quelli non negativi ?

  4. #4
    Originariamente inviato da scozzese
    è possibile avere due long per rappresentare tutti i numeri, anche quelli non negativi ?
    ? A me la domanda non è chiara, non so agli altri
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    16
    Cercherò di essere più chiaro.

    In C/C++ possiamo utilizzare la keywork: unsigned, esiste un equivalente in Java o un modo per bypassare questo problema?

  6. #6
    Originariamente inviato da scozzese
    Cercherò di essere più chiaro.

    In C/C++ possiamo utilizzare la keywork: unsigned, esiste un equivalente in Java o un modo per bypassare questo problema?
    64 bit è appunto il limite per un long in java, perciò occorre "ingegnarsi" un po'. Troverai interessante questo link credo.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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.