Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
15
rated 0 times [  19] [ 4]  / answers: 1 / hits: 23765  / 12 Years ago, tue, november 20, 2012, 12:00:00

I have a signed value given as a hex number, by example 0xffeb and want convert it into -21 as a normal Javascript integer.



I have written some code so far:



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


The problem is, that my function returns 1 as MSB for both numbers because only at the MSB of the binary representation string is looked. And for this case both numbers are 1:



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


Have you any idea to implement this more efficient and nicer?



Greetings,
mythbu


More From » sign

 Answers
52

Use parseInt() to convert (which just accepts your hex string):


parseInt(a);

Then use a mask to figure out if the MSB is set:


a & 0x8000

If that returns a nonzero value, you know it is negative.


To wrap it all up:


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

Note that this only works for 16-bit integers (short in C). If you have a 32-bit integer, you'll need a different mask and subtraction.


[#81898] Sunday, November 18, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
casandra

Total Points: 334
Total Questions: 93
Total Answers: 104

Location: Denmark
Member since Tue, Jul 19, 2022
2 Years ago
;