Precedente :: Successivo |
Autore |
Messaggio |
Crono Semidio


Registrato: 24/03/05 15:12 Messaggi: 224 Residenza: Trieste
|
Inviato: 13 Set 2008 18:24 Oggetto: [JavaScript] Conversione da intero a binario e viceversa |
|
|
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 |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 13 Set 2008 18:56 Oggetto: |
|
|
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 |
|
 |
Crono Semidio


Registrato: 24/03/05 15:12 Messaggi: 224 Residenza: Trieste
|
Inviato: 14 Set 2008 16:08 Oggetto: piccola modifica |
|
|
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 |
|
 |
|
|
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
|
|