Java 十进制和为十六进制相互转换

Java技术 潘老师 9个月前 (08-14) 543 ℃ (0) 扫码查看

在本 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(十进制数)转换为十六进制

  1. 以269为被除数,16为除数
  2. 将被除数除以除数并存储余数
  3. 将上述步骤获得的商除以 16 并存储余数。
  4. 重复第三步,直到商为零。
  5. 最终的十六进制数将是存储的余数的进行反向取余。

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 和自定义方法将十进制数转换为十六进制数。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/8200.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】