2的补法十六进制数到java中的十进制数
2022-09-03 17:30:04
我有一个十六进制字符串,表示2的补码数。有没有一种简单的方法(库/函数)将十六进制转换为十进制,而无需直接处理其位?
例如这是给定左侧十六进制的预期输出:
"0000" => 0
"7FFF" => 32767 (max positive number)
"8000" => -32768 (max negative number)
"FFFF" => -1
谢谢!
我有一个十六进制字符串,表示2的补码数。有没有一种简单的方法(库/函数)将十六进制转换为十进制,而无需直接处理其位?
例如这是给定左侧十六进制的预期输出:
"0000" => 0
"7FFF" => 32767 (max positive number)
"8000" => -32768 (max negative number)
"FFFF" => -1
谢谢!
这似乎欺骗了java在不强制获得正结果的情况下转换数字:
Integer.valueOf("FFFF",16).shortValue(); // evaluates to -1 (short)
当然,这种事情只适用于8,16,32和64位2的补码:
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)
示例如下。
只需编写一个实用程序方法:
public static Integer twosComp(String str) throws java.lang.Exception {
Integer num = Integer.valueOf(str, 16);
return (num > 32767) ? num - 65536 : num;
}
测试:
twosComp("7FFF") -> 32767
twosComp("8000") -> -32768
twosComp("FFFF") -> -1