2012-11-20 1 views
5

Ho un valore con segno dato come numero esadecimale, nell'esempio 0xffeb e voglio convertirlo in -21 come un numero intero Javascript "normale".Javascript: converti un numero intero (esadecimale) con segno javascript

ho scritto qualche codice finora:

function toBinary(a) { //: String 
    var r = ''; 
    var binCounter = 0; 
    while (a > 0) { 
     r = a%2 + r; 
     a = Math.floor(a/2); 
    } 
    return r; 
} 

function twoscompl(a) { //: int 
    var l = toBinaryFill(a).length; 
    var msb = a >>> (l-1); 

    if (msb == 0) { 
     return a; 
    } 

    a = a-1; 
    var str = toBinary(a); 
    var nstr = ''; 
    for (var i = 0; i < str.length; i++) { 
     nstr += str.charAt(i) == '1' ? '0' : '1'; 
    } 
    return (-1)*parseInt(nstr); 
} 

Il problema è, che la mia funzione restituisce 1 come MSB per entrambi i numeri, perché solo a MSB della rappresentazione "stringa" binario è guardato. E per questo caso entrambi i numeri sono 1:

-21 => 0xffeb => 1111 1111 1110 1011 
21 => 0x15 =>    1 0101 

avete qualche idea per attuare questa più efficiente e più bello?

Saluti, mythbu

risposta

10

Usa parseInt() per convertire (che ha appena accetta la stringa esadecimale):

parseInt(a); 

Quindi utilizzare una maschera per capire se il MSB è impostato:

a & 0x8000 

Se restituisce un valore diverso da zero, si sa che è negativo.

Per concludere il tutto:

a = "0xffeb"; 
a = parseInt(a, 16); 
if ((a & 0x8000) > 0) { 
    a = a - 0x10000; 
} 

Si noti che questo funziona solo per interi a 16 bit (short in C). Se hai un intero a 32 bit, avrai bisogno di una maschera e sottrazione diverse.

+2

si dovrebbe meno '0x10000' – xiaoyi

+0

@xiaoyi hai ragione, risolto. –

+0

Non sei sicuro di quanto sia importante, ma dal momento che stai lavorando con esadecimale con 'parseInt', probabilmente vorrai usare' parseInt (a, 16) ' – Ian

8

sono arrivato fino a questo

function hexToInt(hex) { 
    if (hex.length % 2 != 0) { 
     hex = "0" + hex; 
    } 
    var num = parseInt(hex, 16); 
    var maxVal = Math.pow(2, hex.length/2 * 8); 
    if (num > maxVal/2 - 1) { 
     num = num - maxVal 
    } 
    return num; 
} 

e di utilizzo:

var res = hexToInt("FF"); // -1 
res = hexToInt("A"); // same as "0A", 10 
res = hexToInt("FFF"); // same as "0FFF", 4095 
res = hexToInt("FFFF"); // -1 

Quindi, in pratica la gamma di conversione hex dipende dalla lunghezza del hex, formica questo è quello che stavo cercando. Spero che sia d'aiuto.