5

I need to convert one byte into java script signed integer. I have checked this link which converts 2 bytes , but how could I downgrade and convert only one byte?

for example 0x0A would be 10, how about 0xD4?

2
  • parseInt("0xD4", 16) // from 16 bit , parseInt("473", 8) // from 8 bit , parseInt("110011", 2) // from 2 bit , Commented Jun 13, 2019 at 10:01
  • 1
    Please read the question carefully, your solution is working only for unsigned values, for some reason I know that 0xD4 should be a negative value Commented Jun 13, 2019 at 10:04

3 Answers 3

13

Javascript handles bitwise operators as signed 32 bit integers.

Knowing this, if you want to sign extend a byte, you need to propagate the top bit of the byte (which indicates the sign) to all of the higher bits in the thirty two bit integer. This can be achieved with:

value << 24 >> 24

What this does is shift the byte to the top of the 32 bit integer, then shift it back down preserving the sign bit.

Similarly, you can sign extend a 16 bit value with:

value << 16 >> 16
Sign up to request clarification or add additional context in comments.

1 Comment

Or, if you're working with MIDI (like me) you can sign extend a 7-bit 2's complement with value << 25 >> 25. Never thought I'd be doing that! :D
5

This solution converts using 2's complement for negative numbers, which is the standard way negative numbers are encoded.

function uncomplement(val, bitwidth) {
    var isnegative = val & (1 << (bitwidth - 1));
    var boundary = (1 << bitwidth);
    var minval = -boundary;
    var mask = boundary - 1;
    return isnegative ? minval + (val & mask) : val;
}

uncomplement(0xFF, 8) returns -1
uncomplement(0x80, 8) returns -128
uncomplement(0x7F, 8) returns 127

Comments

-3

I came up with this solution:

function convertToSignedInt(signedByte) {
    var sign = signedByte & (1 << 7);
    return (signedByte & 0x7f) * (sign !== 0 ? -1 : 1);
}

Hope it could save others some time. convertToSignedInt(0x81) // returns -1

2 Comments

This is not correct. The value 0x81 represents the signed value -127.
Andy is right: people, please don't waste your time with this answer. The leftshift-rightshift answer above works great BTW.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.