2012-11-20 33 views
5

पर एक (हेक्स) हस्ताक्षरित पूर्णांक को परिवर्तित करें मेरे पास एक हेक्स संख्या के रूप में दिया गया एक हस्ताक्षरित मान है, उदाहरण के लिए 0xffeb और इसे -21 में "सामान्य" जावास्क्रिप्ट पूर्णांक के रूप में परिवर्तित करना चाहते हैं।जावास्क्रिप्ट: जावास्क्रिप्ट मान

मैं अब तक कुछ कोड लिखा है:

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 के रूप में देता है कि 1 क्योंकि केवल बाइनरी प्रतिनिधित्व "स्ट्रिंग" की MSB को देखा है, है। और इस मामले के लिए दोनों संख्या 1 हैं:

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

आप इस अधिक कुशल और अच्छे लागू करने के लिए किसी भी विचार है?

नमस्ते, mythbu

उत्तर

10

उपयोग parseInt() कन्वर्ट करने के लिए (जो सिर्फ अपने हेक्स स्ट्रिंग स्वीकार करता है):

parseInt(a); 

तो एक मुखौटा का उपयोग यह पता लगाने की अगर MSB सेट है:

a & 0x8000 

यदि यह एक गैर-शून्य मूल्य देता है, तो आप जानते हैं कि यह नकारात्मक है।

यह सब लपेट के लिए:

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

ध्यान दें कि 16-बिट पूर्णांकों के लिए यह केवल काम करता है (सी में short)। यदि आपके पास 32-बिट पूर्णांक है, तो आपको एक अलग मुखौटा और घटाव की आवश्यकता होगी।

+2

आपको कम से कम '0x10000' – xiaoyi

+0

@xiaoyi चाहिए, ठीक है, इसे ठीक करें। –

+0

यह सुनिश्चित नहीं है कि यह कितना महत्वपूर्ण है, लेकिन चूंकि आप 'parseInt' के साथ हेक्स के साथ काम कर रहे हैं, तो आप शायद' 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 

तो मूल रूप से हेक्स रूपांतरण रेंज हेक्स की दूरी पर निर्भर करता है, चींटी इस के लिए मैं क्या देख रहा था। आशा करता हूँ की ये काम करेगा।

संबंधित मुद्दे