章
目
录
在本 Java 教程中,我们将了解十进制数和十六进制数之间的区别,以及如何使用内置 Java API 和自定义方法将十进制数与十六进制数相互转换。
1.十进制数和十六进制数的区别
1.1. 不同之处
十进制数使用[0-9]之间的10个符号(即基数10)来表示一个数字,而十六进制数则使用[0-9,A-F]之间的16个符号(即基数16)来表示一个数字。
十进制数的基数是 10,即十进制数的所有位数均以 10 的幂表示。十六进制数的基数是 16,即十六进制数的所有位数均以 16的幂表示。
1.2. 数学转换
由于十六进制数是用16的幂来表示的,因此我们可以将给定的十进制数除以16并听过余数来得到相应的十六进制数。让我们通过一个例子来理解这一点。
让我们一步步将 269(十进制数)转换为十六进制
- 以269为被除数,16为除数
- 将被除数除以除数并存储余数
- 将上述步骤获得的商除以 16 并存储余数。
- 重复第三步,直到商为零。
- 最终的十六进制数将是存储的余数的进行反向取余。
2. Java中不同基数的表示
在 Java 中,所有数字数据类型(int、long、float、double)始终表示十进制格式的值。int/float不可能保存任何二进制、八进制或十六进制格式的数字。
我们可以使用预定义的前缀将二进制、八进制或十六进制值分配给int/long。
int hexNum = 0X10D; // '0X' 或 '0x' 开头表示16进制
int octNumber = 01560; // '0' 开头表示10进制
最后,它仍然会被转换为十进制,并且打印该变量将仅以十进制形式打印值。
System.out.println(hexNum); // 269
System.out.println(octNumber); // 880
因此,我们永远无法获得int或其他十进制类型数据类型中任何数字的十六进制、八进制或二进制表示,因此我们只需要以String格式表示十六进制/八进制/二进制数字。
3.1. 使用数字类
所有 Java 数字类都提供内置方法来执行从十进制数到等效十六进制数的转换。让我们列出这些方法:
对于Integer 和Long类:
- Integer.toString(num, radix);
- Integer.toHexString(num);
- Long.toString(num, radix);
- Long.toHexString(num);
- BigInteger.toString(Radix);
对于Float和Double类:
- Float.toHexString(num);
- Double.toHexString(num);
在toString()方法中,我们传递基数(16 表示十六进制)以及要转换的数字。
int number = 269;
String hex = Integer.toString(number, 16); // '10d'
toHexString ()方法直接将给定的数字转换为十六进制形式。
double number = 333.44d;
String hex = Double.toHexString(number); // '0x1.4d70a3d70a3d7p8'
BigInteger类还提供了用于相同目的的toString (radix)方法。
BigInteger number = new BigInteger("269");
String hex = number.toString(16); // '10d'
3.2. 使用String.format()
String类有一个重载的format()方法,该方法接受格式说明符。表示十六进制数字的格式是%x。该方法可用于将十进制整数转换为十六进制字符串。
int number = 269;
String hex = String.format("%x", number); // '10d'
.3. 使用自定义方法
我们还可以为本文第一部分中讨论的算法创建自定义方法和代码。
- 执行十进制数的长除法。
- 取除法的余数部分。
- 根据余数得到十六进制字符。
- 将标记添加到结果中。
- 重复这些步骤,直到商结果为0。
public static String convertToHex(int number) {
if (number <= 0) {
return "0";
}
int remainder;
StringBuilder result = new StringBuilder();
String tokens = "0123456789ABCDEF";
while (number > 0) {
remainder = number % 16;
result.insert(0, tokens.charAt(remainder));
number = number / 16;
}
return result.toString();
}
现在我们可以使用这个方法在Java中进行十进制到十六进制的转换。
String hex = convertToHex(269);
System.out.println(hex); // '10D'
4. 将十六进制数转换为十进制数
4.1. 使用数字类
如果转换为Integer和Long类型,则从十六进制字符串转换为 Java Number 类型很容易。对于此类转换有直接的 API 支持:
- Integer.parseInt(hex, radix);
- Integer.valueOf(hex, radix);
- Integer.decode(hex);
- Long.parseLong(hex, radix);
- Long.valueOf(hex, radix);
- Long.decode(hex);
- new BigInteger(hex, radix);
以下示例使用定义的方法将十六进制转换为整数类型。对于十六进制到长整型的转换也可以进行同样的操作。
String hex = "10D";
int decimal = Integer.parseInt(hex,16);
//or
int decimal = Integer.valueOf(hex,16);
//or
int decimal = Integer.decode("Ox" + hex);
BigInteger类还提供了一个构造函数new BigInteger(hex, radix)来实现相同的目的。
BigInteger decimal = new BigInteger("10d",16);
System.out.println(decimal); // 269
将十六进制转换为浮点数(float和double)并不简单。我们需要执行以下步骤:
- 将十六进制字符串解析为整数
- 使用
Float.intBitsToFloat()
或Double.longBitsToDouble()
将整数解释为浮点或双精度值。
String myString = "BF800000";
Long i = Long.parseLong(myString, 16);
Float f = Float.intBitsToFloat(i.intValue());
//converted float value
System.out.println(f);
//Convert the float back to hex and verify
System.out.println(Integer.toHexString(Float.floatToIntBits(f)));
程序输出:
-1.0
bf800000
4.2. 使用自定义方法
要使用原始方法将十六进制字符串转换为十进制整数,我们将使用以下简单算法。
- 查找对应的十六进制标记的十进制数
- 首先,将要在其中添加此十进制标记的变量乘以 16,然后添加十进制数。
- 重复这些步骤,直到十六进制字符串的最后一个标记。
public static int convertHexToDecimal(String hex) {
String tokens = "0123456789ABCDEF";
hex = hex.toUpperCase();
int result = 0;
for (int i = 0; i < hex.length(); i++) {
int n = tokens.indexOf(hex.charAt(i));
result = result * 16 + n;
}
return result;
}
让我们测试一下该方法。
System.out.println(convertHexToDecimal("10D")); //269
5. 结论
在本Java 数据类型教程中,我们了解了十进制数和十六进制数之间的区别,以及使用 API 和自定义方法将十进制数转换为十六进制数。