I have a hex string that represents a 2's complement number. Is there an easy way (libraries/functions) to translate the hex into a decimal without working directly with its bits??
E.G. This is the expected output given the hex on the left:
"0000" => 0
"7FFF" => 32767 (max positive number)
"8000" => -32768 (max negative number)
"FFFF" => -1
Thanks!
To find hexadecimal 2's complement:Subtract the number from FFFFFFFF. Add 1.
Two's complement is an agreement how to represent signed integral numbers in e.g. 16 bits (in olden times, different representations have been used by various processors, e.g. one's complement or sign-magnitude). Positive numbers and zero are represented as expected: 0 is 0000 0000 0000 0000 or hex 0000.
To get 2's complement of binary number is 1's complement of given number plus 1 to the least significant bit (LSB). For example 2's complement of binary number 10010 is (01101) + 1 = 01110.
In Java programs, hexadecimal numbers are written by placing 0x before numbers.
This seems to trick java into converting the number without forcing a positive result:
Integer.valueOf("FFFF",16).shortValue(); // evaluates to -1 (short)
Of course this sort of thing only works for 8, 16, 32, and 64-bit 2's complement:
Short.valueOf("FF",16).byteValue(); // -1 (byte)
Integer.valueOf("FFFF",16).shortValue(); // -1 (short)
Long.valueOf("FFFFFFFF",16).intValue(); // -1 (int)
new BigInteger("FFFFFFFFFFFFFFFF",16).longValue(); // -1 (long)
Example here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With