2012-11-20 18 views
5

符号付きの値を16進数で指定します(例:0xffeb)。これを「通常の」Javascript整数として-21に変換します。私がこれまでにいくつかのコードを書かれているJavascript:符号付き整数をjavacript値に変換する

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

問題はバイナリ表現「文字列」のMSBを見ているので、私の関数は、両方の番号をMSBとして1を返すこと、です。この場合、両方の数値は1:

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

これをより効率的に、よりよく実装することをお考えですか? (ちょうどあなたの16進数文字列を受け入れる)に変換する

挨拶、 mythbu

答えて

10

使用parseInt():次に

parseInt(a); 

MSBが設定されているかどうかを把握するためにマスクを使用します。

a & 0x8000 

この値が0以外の値を返す場合は、それが負であることがわかります。

それをすべてを包むために:

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

なお、16ビット整数のため、この唯一の作品(Cでshort)。 32ビット整数の場合は、別のマスクと減算が必要です。

+2

あなたはマイナスの「0x10000」 – xiaoyi

+0

@ xiaoyiあなたは正しいと思います。 –

+0

それがどれほど重要かは分かりませんが、 'parseInt'で16進数を扱っているので、' parseInt(a、16) 'を使用したいと考えています。 – Ian

8

私はこの

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

と使用方法を思い付いた:

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

だから、基本的に進変換範囲は、六角の長さに依存し、アリこれは私が探していたものです。それが役に立てば幸い。