2012-11-20 21 views
5

Mam podpisaną wartość podaną jako liczba szesnastkowa, według przykładu 0xffeb i chcę przekonwertować ją na -21 jako "normalną" liczbę całkowitą w języku Javascript.JavaScript: przekonwertuj (całkowitą) liczbę całkowitą ze znakiem szesnastkowym na wartość javascript.

Pisałem jakiś kod do tej pory:

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); 
} 

Problemem jest to, że moja funkcja zwraca 1 jako MSB dla obu liczb, ponieważ tylko w MSB binarnej reprezentacji „string” to wyglądało. I na tym przypadku oba numery są 1:

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

Czy macie jakiś pomysł, aby zaimplementować to bardziej efektywny i ładniejszy?

Pozdrowienia, mythbu

Odpowiedz

10

Zastosowanie parseInt() do konwersji (który właśnie akceptuje swój ciąg szesnastkowy):

parseInt(a); 

następnie użyć maski, aby dowiedzieć się, czy MSB jest ustawiony:

a & 0x8000 

Jeśli to zwróci wartość niezerową, wiesz, że jest ujemna.

Aby zawinąć to wszystko:

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

Zauważ, że to działa tylko dla 16-bitowych liczb całkowitych (short w C). Jeśli masz 32-bitową liczbę całkowitą, potrzebujesz innej maski i odejmowania.

+2

powinieneś pomijać '0x10000' – xiaoyi

+0

@xiaoyi masz rację, popraw to. –

+0

Nie wiesz, jak ważne jest to, ale ponieważ pracujesz z hexem z 'parseInt', prawdopodobnie chcesz użyć' parseInt (a, 16) ' – Ian

8

wymyśliłem tego

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; 
} 

i użytkowania:

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

Więc zasadniczo zakres konwersji hex zależy od długości HEX, w mrówkę to jest to, czego szukałem. Mam nadzieję, że to pomoże.