Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
[JavaScript] Conversione da intero a binario e viceversa
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet
Precedente :: Successivo  
Autore Messaggio
Crono
Semidio
Semidio


Registrato: 24/03/05 15:12
Messaggi: 224
Residenza: Trieste

MessaggioInviato: 13 Set 2008 18:24    Oggetto: [JavaScript] Conversione da intero a binario e viceversa Rispondi citando

Recentemente ho dovuto creare in javascript le funzioni equivalenti a decbin() e bindec() di php e ho deciso di condividere il risultato del mio lavoro con chiunque ne avesse bisogno.

decbin() prende in ingresso un numero intero in base dieci con segno positivo o negativo e restituisce una stringa con il corrispondente valore binario a 32 bit, i numeri con segno negativo sono ottenuti con il metodo del complemento a 2.
bindec() prende in ingresso una stringa corrispondente ad un numero binario a 32 bit e restituisce il corrispondente numero intero in base dieci

Codice:
//ATTENZIONE questa funzione non prevede un
//controllo del parametro in ingresso per
//assicurarsi che sia un numero intero e non
//qualcos'altro, il codice di verifica dovrà
//essere implementato a parte
function decbin(dec) {
 //viene eseguita una funzione che elimina
 //la parte decimale eventualmente presente
 //in dec per avere la certezza di lavorare
 //con un numero intero
 dec = parseInt(dec);
 //se dec è fuori dall'intervallo di valori
 //rappresentabili in forma binaria la
 //funzione termina restituendo una stringa
 //nulla (-2^n-1)<=dec<=((2^n-1)-1)
 if(!(Math.pow(-2, 31)<=dec && Math.pow(2, 31)-1>=dec)) return ""
 //se dec è un numero con segno positivo
 //esegue la conversione in numero binario
 //altrimenti fa il complemento a 1 del
 //numero convertito in binario e poi
 //esegue la somma binaria con 1
 var i, bin = Math.abs(dec).toString(2);
 if(dec>=0) for(i=0; bin.length<32; i++) bin = "0"+bin;
 else {
  var tmp = bin.charAt(0)=="0"?"1":"0";
  for(i=1; i<bin.length; i++) {
   if(bin.charAt(i)=="0") tmp+="1";
   else tmp+="0";
  }
  for(i=0; tmp.length<32; i++) tmp = "1"+tmp;
  var rip = true;
  for(i=tmp.length-1; i>=0; i--) {
   if(tmp.charAt(i)=="1" && rip) bin = "0"+bin;
   else if(tmp.charAt(i)=="0" && rip) {
    bin = "1"+bin;
    rip = false;
   } else bin = tmp.charAt(i)+bin;
  }
 }
 return bin;
}

function bindec(bin) {
 //viene verificato che la stringa bin abbia una
 //lunghezza di 32 caratteri e che ogni carattere
 //di bin sia o 0 o 1 altrimenti la funzione
 //termina restituendo una stringa nulla
 if(bin.length>32) return "";
 var i;
 for(i=0; i<32; i++)
  if(bin.charAt(i)!="0" && bin.charAt(i)!="1") return "";
 var j, dec;
 //se il bit più significativo è uno 0 esegue
 //la conversione in numero decimale
 //se il bit più significativo è un 1 esegue
 //il complemento a 1 poi la somma binaria
 //con 1 e infine la conversione in numero
 //decimale
 if(bin.charAt(0)=="0")
  for(i=31, j=0; i>=bin.indexOf("1"); i--, j++)
   dec+=bin.charAt(i)*Math.pow(2, j);
 else {
  var tmp = "";
  for(i=0; i<32; i++) {
   if(bin.charAt(i)=="0") tmp+="1";
   else tmp+="0";
  }
  bin = "";
  var rip = true;
  for(i=31; i>=0; i--) {
   if(tmp.charAt(i)=="1" && rip) bin = "0"+bin;
   else if(tmp.charAt(i)=="0" && rip) {
    bin = "1"+bin;
    rip = false;
   } else bin = tmp.charAt(i)+bin;
  }
  for(i=31, j=0; i>=bin.indexOf("1"); i--, j++)
   dec+=bin.charAt(i)*Math.pow(2, j);
  dec*=-1;
 }
 return dec;
}
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 13 Set 2008 18:56    Oggetto: Rispondi citando

Grazie caro,
appena ho un po' di tempo le provo!
Sono le classiche funzioni che si usano 2 volte nella vita ma quando servono non ci sono mai!
Top
Profilo Invia messaggio privato
Crono
Semidio
Semidio


Registrato: 24/03/05 15:12
Messaggi: 224
Residenza: Trieste

MessaggioInviato: 14 Set 2008 16:08    Oggetto: piccola modifica Rispondi

mi sono accorto di aver dimenticato di resettare una variabile, nella funzione decbin(), ecco il codice corretto:

Codice:
 //ATTENZIONE questa funzione non prevede un
//controllo del parametro in ingresso per
//assicurarsi che sia un numero intero e non
//qualcos'altro, il codice di verifica dovrà
//essere implementato a parte
function decbin(dec) {
 //viene eseguita una funzione che elimina
 //la parte decimale eventualmente presente
 //in dec per avere la certezza di lavorare
 //con un numero intero
 dec = parseInt(dec);
 //se dec è fuori dall'intervallo di valori
 //rappresentabili in forma binaria la
 //funzione termina restituendo una stringa
 //nulla (-2^n-1)<=dec<=((2^n-1)-1)
 if(!(Math.pow(-2, 31)<=dec && Math.pow(2, 31)-1>=dec)) return ""
 //se dec è un numero con segno positivo
 //esegue la conversione in numero binario
 //altrimenti fa il complemento a 1 del
 //numero convertito in binario e poi
 //esegue la somma binaria con 1
 var i, bin = Math.abs(dec).toString(2);
 if(dec>=0) for(i=0; bin.length<32; i++) bin = "0"+bin;
 else {
  var tmp = bin.charAt(0)=="0"?"1":"0";
  for(i=1; i<bin.length; i++) {
   if(bin.charAt(i)=="0") tmp+="1";
   else tmp+="0";
  }
  for(i=0; tmp.length<32; i++) tmp = "1"+tmp;
  bin="";
  var rip = true;
  for(i=tmp.length-1; i>=0; i--) {
   if(tmp.charAt(i)=="1" && rip) bin = "0"+bin;
   else if(tmp.charAt(i)=="0" && rip) {
    bin = "1"+bin;
    rip = false;
   } else bin = tmp.charAt(i)+bin;
  }
 }
 return bin;
}

function bindec(bin) {
 //viene verificato che la stringa bin abbia una
 //lunghezza di 32 caratteri e che ogni carattere
 //di bin sia o 0 o 1 altrimenti la funzione
 //termina restituendo una stringa nulla
 if(bin.length>32) return "";
 var i;
 for(i=0; i<32; i++)
  if(bin.charAt(i)!="0" && bin.charAt(i)!="1") return "";
 var j, dec;
 //se il bit più significativo è uno 0 esegue
 //la conversione in numero decimale
 //se il bit più significativo è un 1 esegue
 //il complemento a 1 poi la somma binaria
 //con 1 e infine la conversione in numero
 //decimale
 if(bin.charAt(0)=="0")
  for(i=31, j=0; i>=bin.indexOf("1"); i--, j++)
   dec+=bin.charAt(i)*Math.pow(2, j);
 else {
  var tmp = "";
  for(i=0; i<32; i++) {
   if(bin.charAt(i)=="0") tmp+="1";
   else tmp+="0";
  }
  bin = "";
  var rip = true;
  for(i=31; i>=0; i--) {
   if(tmp.charAt(i)=="1" && rip) bin = "0"+bin;
   else if(tmp.charAt(i)=="0" && rip) {
    bin = "1"+bin;
    rip = false;
   } else bin = tmp.charAt(i)+bin;
  }
  for(i=31, j=0; i>=bin.indexOf("1"); i--, j++)
   dec+=bin.charAt(i)*Math.pow(2, j);
  dec*=-1;
 }
 return dec;
}
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi