2の補数を表す16進文字列があります。ビットを直接操作せずに16進数を10進数に変換する簡単な方法(ライブラリ/関数)はありますか?
EGこれは、左側の16進で期待される出力です。
"0000" => 0
"7FFF" => 32767 (max positive number)
"8000" => -32768 (max negative number)
"FFFF" => -1
ありがとう!
2の補数を表す16進文字列があります。ビットを直接操作せずに16進数を10進数に変換する簡単な方法(ライブラリ/関数)はありますか?
EGこれは、左側の16進で期待される出力です。
"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
これはかなりうまくいくようです。非標準の長さの文字列を渡すと、だまされる可能性があります。「FFF」は -1 にマップされます。ゼロパディングにより、障害が修正されます。
どのタイプの戻り値が必要か明確ではないため、Number
適切なサイズで を返しました。
public Number hexToDec(String hex) {
if (hex == null) {
throw new NullPointerException("hexToDec: hex String is null.");
}
// You may want to do something different with the empty string.
if (hex.equals("")) { return Byte.valueOf("0"); }
// If you want to pad "FFF" to "0FFF" do it here.
hex = hex.toUpperCase();
// Check if high bit is set.
boolean isNegative =
hex.startsWith("8") || hex.startsWith("9") ||
hex.startsWith("A") || hex.startsWith("B") ||
hex.startsWith("C") || hex.startsWith("D") ||
hex.startsWith("E") || hex.startsWith("F");
BigInteger temp;
if (isNegative) {
// Negative number
temp = new BigInteger(hex, 16);
BigInteger subtrahend = BigInteger.ONE.shiftLeft(hex.length() * 4);
temp = temp.subtract(subtrahend);
} else {
// Positive number
temp = new BigInteger(hex, 16);
}
// Cut BigInteger down to size.
if (hex.length() <= 2) { return (Byte)temp.byteValue(); }
if (hex.length() <= 4) { return (Short)temp.shortValue(); }
if (hex.length() <= 8) { return (Integer)temp.intValue(); }
if (hex.length() <= 16) { return (Long)temp.longValue(); }
return temp;
}
出力例:
"33" -> 51
"FB" -> -5
"3333" -> 13107
"FFFC" -> -4
"33333333" -> 53687091
"FFFFFFFD" -> -3
"3333333333333333" -> 3689348814741910323
"FFFFFFFFFFFFFFFE" -> -2
"33333333333333333333" -> 241785163922925834941235
"FFFFFFFFFFFFFFFFFFFF" -> -1