(基础)常见进制间转换

235 阅读4分钟

进制转换

什么是进制转换?

  • 进制转换是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。位权是指,进位制中每一固定位置对应的单位值。* 这里面讲了符号、基数、位权、让我们来一一解释这些都是什么吧。
符号是什么呢?

符号就是每个进制的数字,比如 二进制 = 10011,这串就是符号。

  1. 二进制的符号是0-1
  2. 十进制的符号是0-9
  3. 十六进制的符号就是0-9 A-F(A-F 分别表示 10 到 15)
  4. 八进制的符号就是0-7
那什么是基数呢?

基数就是进制的数字,比如二进制的基数就是2了,这样下去以此类推。

那什么是位权呢?

位权就是每个进制从右到左数数,就比如10011,从右到数,因为计算机是从0开始的所以从右到左数就是0 1 2 3 4,这就是位权

二进制转十进制

就是每一位的符号 x 基数的位权幂,例如:二进制 1101 转十进制: 从左边第一个符号是1乘以基数是2的3次幂(位权)

123+122+022+1201*2^3+1*2^2+0*2^2+1*2^0
=8+4+0+1=8+4+0+1
=13=13
十进制转二进制呢?

这种就不是通过上面进行运算操作了,这种是通过通过不断取模和整除的,就是通过不断地 除以基数(2)并记录余数 来实现的 例如:13

  1. 13/2(基数) = 6 余 1
  2. 6/2(基数) = 3 余 0
  3. 3/2(基数) = 1 余 1
  4. 1/2(基数) = 0 余 1

结果:从低位到高位,余数依次是 1, 0, 1, 1,反转后为 1101

那可能有人问了,如果是负数的呢?那就进行补码取反再+1

十六进制转十进制

也是跟上面差不多就是,16进制从10开始都是以大写A-F,例如:十六进制 1A3 转十进制:

1×162+10×161+3×160=256+160+3=4191×162+10×161+3×160=256+160+3=419
十进制转十六进制

通过不断取模和整除的方式:

  • 十进制数 ÷ 16,记录余数(大于 9 的余数用 A-F 表示)。
  • 继续对商进行除 16,直到商为 0。
  • 将所有余数反向排列,得到十六进制表示。

例如:十进制 419 转十六进制:

  1. 419÷16=26 余 3;
  2. 26÷16=1,余 10(对应 A);
  3. 1÷16=0,余 1。

结果:将余数反转,得到十六进制 1A3

那二进制转十六进制呢

每 4 位二进制为一组,从右向左分组,转换为对应的十六进制数字。 例如:二进制 11010011 转十六进制:

  • 分组:11010011
  • 转换:1101 = D0011 = 3

结果:十六进制为 D3

八进制的计算类似
  • 转十进制:每一位乘以 8 的幂,再相加。
  • 转其他进制:先转十进制,再按上述方法转换。
那可能有人说了,Java中进制转换是怎么转换的呢?使用的是什么方法呢?
可以直接使用Integer.parseInt这个方法:
    public class BaseConversion{
        public static void main(String[] args){
            //二进制转十进制
            int binaryToDecimal = Integer.parseInt("1101",2);
            System.out.println("二进制1101转十进制:" + binaryToDecimal);//输出13
            // 八进制转十进制 
            int octalToDecimal = Integer.parseInt("15", 8); 
            System.out.println("八进制 15 转十进制: " + octalToDecimal); // 输出 13 
            // 十六进制转十进制 
            int hexToDecimal = Integer.parseInt("1A3", 16);
            System.out.println("十六进制 1A3 转十进制: " + hexToDecimal); // 输出 419
        }
    }
十进制转其他进制
使用 Integer.toBinaryStringtoOctalStringtoHexString 方法:
public class DecimalToOtherBase {
    public static void main(String[] args) {
        int decimal = 13;

        // 十进制转二进制
        String binary = Integer.toBinaryString(decimal);
        System.out.println("十进制 13 转二进制: " + binary); // 输出 1101

        // 十进制转八进制
        String octal = Integer.toOctalString(decimal);
        System.out.println("十进制 13 转八进制: " + octal); // 输出 15

        // 十进制转十六进制
        String hex = Integer.toHexString(decimal);
        System.out.println("十进制 13 转十六进制: " + hex); // 输出 d
    }
}

二进制直接转十六进制
可以先转为十进制,再转为十六进制:
public class BinaryToHex {
    public static void main(String[] args) {
        String binary = "1101";

        // 二进制转十进制
        int decimal = Integer.parseInt(binary, 2);

        // 十进制转十六进制
        String hex = Integer.toHexString(decimal);

        System.out.println("二进制 1101 转十六进制: " + hex); // 输出 d
    }
}