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 |