2012-11-20 21 views
5

Tôi có giá trị đã ký được cung cấp dưới dạng số hex, ví dụ: 0xffeb và muốn chuyển đổi số nguyên thành -21 làm số nguyên Javascript "bình thường".Javascript: chuyển đổi số nguyên có dấu (hex) thành giá trị javascript

Tôi đã viết một số mã cho đến nay:

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

Vấn đề là, rằng chức năng của tôi trả về 1 như MSB cho cả hai con số bởi vì chỉ có tại MSB của các đại diện nhị phân "chuỗi" được xem xét. Và đối với trường hợp này cả hai số là 1:

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

Bạn có ý tưởng thực hiện điều này hiệu quả hơn và đẹp hơn không?

Greetings, mythbu

Trả lời

10

Sử dụng parseInt() để chuyển đổi (trong đó chỉ chấp nhận chuỗi hex của bạn):

parseInt(a); 

Sau đó sử dụng một mặt nạ để tìm ra nếu MSB được thiết lập:

a & 0x8000 

Nếu trả về giá trị khác, bạn biết nó là số âm.

Để quấn nó tất cả lên:

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

Lưu ý rằng điều này chỉ làm cho số nguyên 16-bit (short trong C). Nếu bạn có số nguyên 32 bit, bạn sẽ cần một mặt nạ và phép trừ khác.

+2

bạn nên trừ đi '0x10000' – xiaoyi

+0

@xiaoyi bạn đã đúng, đã sửa nó. –

+0

Không chắc nó quan trọng như thế nào, nhưng vì bạn đang làm việc với hex với 'parseInt', bạn có thể muốn sử dụng' parseInt (a, 16) ' – Ian

8

tôi đến với

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

Và việc sử dụng này:

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

Vì vậy, về cơ bản phạm vi chuyển đổi hex phụ thuộc vào chiều dài của hex, ant đây là những gì tôi đang tìm kiếm. Hy vọng nó giúp.