lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Java中十进制二进制相互转换的方法

在计算机中,数字的表示方式有多种,其中最常见的两种是十进制和二进制。十进制是我们日常生活中最熟悉的数制,它有10个数字符号,从0到9。二进制是计算机内部使用的数制,它只有两个数字符号,0和1。

在Java中,有时我们需要在十进制和二进制之间进行转换,例如在处理位运算或加密算法时。本文将介绍三种常用的方法来实现这种转换,并给出相应的代码示例。

方法一:使用Integer类的内置方法

Java提供了一个封装了整数相关操作的类Integer,它有一些内置的方法可以实现进制转换。我们可以利用以下两个方法来实现十进制和二进制之间的转换:

  • Integer.toString(int i, int radix):这个方法可以将一个整数i转换为指定基数radix的字符串表示。对于二进制,radix为2。
  • Integer.parseInt(String s, int radix):这个方法可以将一个指定基数radix的字符串s解析为一个整数。对于二进制,radix为2。

以下是使用这两个方法的代码示例:

// 十进制转二进制
int decimal = 156; // 十进制数
String binary = Integer.toString(decimal, 2); // 转换为二进制字符串
System.out.println(binary); // 输出10011100

// 二进制转十进制
String binary = "10011100"; // 二进制字符串
int decimal = Integer.parseInt(binary, 2); // 解析为十进制数
System.out.println(decimal); // 输出156

这种方法的优点是简单方便,不需要自己编写转换逻辑,只需要调用Java内置的方法即可。缺点是不能处理非整数或超过整数范围的数字。

方法二:使用除基取余法

这种方法是按照我们平时的数学逻辑思维,把十进制数不断除以2,然后把每次得到的余数(0或1)从下往上排列,直到商为0为止。例如,把十进制数156转换为二进制数的过程如下:

余数
156÷2=78 0
78÷2=39 0
39÷2=19 1
19÷2=9 1
9÷2=4 1
4÷2=2 0
2÷2=1 0
1÷2=0 1

所以,156<sub>10</sub>=10011100<sub>2</sub>。

要把一个二进制数转换为十进制数,也可以使用类似的方法,只不过是把除法变成乘法,把余数变成权值(即二的幂次方)。例如,把二进制数10011100转换为十进制数的过程如下:

10011100<sub>2</sub>=1×2<sup>7</sup>+0×2<sup>6</sup>+0×2<sup>5</sup>+1×2<sup>4</sup>+1×2<sup>3</sup>+1×2<sup>2</sup>+0×2<sup>1</sup>+0×2<sup>0</sup>

=128+16+8+4

=156

所以,10011100<sub>2</sub>=156<sub>10</sub>.

以下是使用这种方法的代码示例:

// 十进制转二进制
int decimal = 156; // 十进制数
String binary = ""; // 存储二进制字符串
while (decimal != 0) {
    binary = decimal % 2 + binary; // 把余数放在前面
    decimal = decimal / 2; // 把商作为新的被除数
}
System.out.println(binary); // 输出10011100

// 二进制转十进制
String binary = "10011100"; // 二进制字符串
int decimal = 0; // 存储十进制数
int len = binary.length(); // 获取二进制字符串的长度
for (int i = 0; i < len; i++) {
    // 第i位的数字为:
    int digit = Character.getNumericValue(binary.charAt(i));
    // 第i位的权值为:
    int power = (int) Math.pow(2, len - i - 1);
    // 累加到结果中
    decimal += digit * power;
}
System.out.println(decimal); // 输出156

这种方法的优点是符合数学原理,可以处理任意大小的数字,不受整数范围的限制。缺点是需要自己编写转换逻辑,比较繁琐,而且可能会出现精度损失的问题。

方法三:使用位运算法

这种方法是利用Java中的位运算符,来实现十进制和二进制之间的转换。位运算符有以下几种:

    • &:按位与,对两个操作数的每一位进行逻辑与运算,只有两个位都为1时,结果才为1。
    • |:按位或,对两个操作数的每一位进行逻辑或运算,只有两个位都为0时,结果才为0。
    • ^:按位异或,对两个操作数的每一位进行逻辑异或运算,只有两个位不同时,结果才为1。
    • ~:按位取反,对一个操作数的每一位进行逻辑非运算,即把0变成1,把1变成0。
    • <<:左移运算符,把一个操作数的所有位向左移动指定的位数,右边用0补齐。相当于乘以2的指定次方。
    • >>:右移运算符,把一个操作数的所有位向右移动指定的位数,左边用符号位补齐。相当于除以2的指定次方。
    • >>>:无符号右移运算符,把一个操作数的所有位向右移动指定的位数,左边用0补齐。相当于除以2的指定次方。

要把一个十进制数转换为二进制数,可以使用以下步骤:

    • 定义一个整型变量mask,它的值为1左移31位(即10000000 00000000 00000000 00000000),用来作为掩码。
    • 使用&运算符将十进制数和mask进行按位与运算,得到最高位(第31位)的值(0或1)。
    • 使用>>>运算符将十进制数无符号右移一位(即去掉最高位)。
    • 使用<<运算符将mask左移一位(即去掉最低位)。
    • 重复上述步骤,直到mask为0为止。

例如,把十进制数156转换为二进制数的过程如下:

十进制mask&>>><<
156 10000000 00000000 00000000 00000000 0 01111110 01000000 00000000 00000000 00000000
78 01000000 00000000 00000000 00000000 0 00111111  
posted on 2023-07-19 19:07  白露~  阅读(3498)  评论(0编辑  收藏  举报