I have a number of devices that I maintain drivers for that take negative values for the parameter. As expected, they are in two's complement in terms of notation.
I normally just brute force it in a quick function (value == -1 ? 255 : value == -2 ? 254) etc.
But I thought I would try to learn something for once and see if there was a more elegant way to do this. So, is there a quick way to convert a signed integer to its two's complement resultant value?
How about something like
def x = -1
value = 256 - Math.abs(x)
Math.abs() will turn a negative number into a positive and keep a positive a positive.
I'm not sure if you would need to put another check in to only do it if x is < 0.
Yeah, that would be easier than how I'm doing it now...
if (val<0) {newVal = 256 + val}
Or subtracting the abs like you did. Same thing.
1 Like
Another way is this:
before you turn the binary string into a decimal take a look at the MSB to see if it is a '1' or '0' -
if MSB is a '1' then turn it into a '0' (or remove it from the string), convert to a decimal and multiply the decimal result by -1.0,
else if MSB was '0' just convert to a decimal
Here is how I do it in Python (you can convert it to groovy):
def bin2s2dec(numStr):
bitMSB = numStr[0:1]
if bitMSB == '1':
return -1 * int(numStr[1:],2)
else:
return int(numStr, 2)
1 Like