【ShuQiHere】 进制转换的世界:从十进制到二进制、十六进制的转换技巧

【ShuQiHere】

在计算机科学中,进制转换(Radix Conversion) 是一个基础且非常重要的技能。无论是理解计算机的存储、数据表示,还是在编程中处理不同的进制数据,进制转换都是不可或缺的。本文将详细讲解 十进制(Decimal, 10进制)二进制(Binary, 2进制)十六进制(Hexadecimal, 16进制) 之间的转换,帮助你扎实掌握这些技巧,并通过丰富的例子加深理解。🧠

什么是进制?🧮

进制是表示数字的方式。每种进制都有其基数(Base),表示该进制每一位数字可以取的值的范围。常见的进制有:

  • 十进制(Decimal, base-10):我们日常使用的数字系统,基数为10,使用的符号是0-9。
  • 二进制(Binary, base-2):计算机底层使用的数字系统,基数为2,符号是0和1。🖥️
  • 十六进制(Hexadecimal, base-16):常用于计算机系统,基数为16,符号是0-9和A-F,其中A表示10,B表示11,依此类推,直到F表示15。💡

进制的实际应用

  • 二进制(Binary, 2进制) 是计算机中最底层的数据表示方式,计算机存储和处理的数据都是以二进制形式存储的。
  • 十六进制(Hexadecimal, 16进制) 通常用于简化二进制表示。一个十六进制数字可以表示四位二进制数字(4 bits),因此它在表示内存地址和机器码时非常方便。

现在让我们通过更详细的例子来深入理解不同进制之间的转换!🚀


1. 十进制转二进制(Decimal to Binary, 10-2) ⚙️

十进制转二进制 通常使用 除2取余法。这个方法的核心是不断将十进制数除以2,记录每次除法的余数,直到商为0。最后,将余数逆序排列得到二进制数。

步骤:

  1. 将十进制数不断除以 2,并记录每次的余数。
  2. 将余数从最后一次除法结果开始反向排列,得到最终的二进制结果。

示例:

59 转换为二进制:

  1. 59 ÷ 2 = 29,余数 1
  2. 29 ÷ 2 = 14,余数 1
  3. 14 ÷ 2 = 7,余数 0
  4. 7 ÷ 2 = 3,余数 1
  5. 3 ÷ 2 = 1,余数 1
  6. 1 ÷ 2 = 0,余数 1

将余数逆序排列得到:
59_{10} = 111011_2

背景知识:

在计算机存储中,二进制 是最基础的表示方式。每个二进制位(bit)表示一个最小存储单元,且每一位只有两种可能的状态:0 或 1。

Java代码手动实现:

java 复制代码
public class DecimalToBinaryManual {
    public static String decimalToBinary(int n) {
        StringBuilder binaryNum = new StringBuilder();
        while (n > 0) {
            binaryNum.append(n % 2);
            n = n / 2;
        }
        return binaryNum.reverse().toString();
    }

    public static void main(String[] args) {
        System.out.println(decimalToBinary(59));  // 输出: 111011
    }
}

2. 十进制转十六进制(Decimal to Hexadecimal, 10-16) 🔢

将十进制数转换为十六进制可以使用 除16取余法。通过不断将十进制数除以16并记录余数,最后将余数逆序排列即可得到十六进制数。

步骤:

  1. 将十进制数不断除以 16,并记录每次的余数。
  2. 余数部分对应十六进制的符号:0-9 对应本身,10-15 对应 A-F
  3. 将余数逆序排列,得到最终的十六进制数。

示例:

1234 转换为十六进制:

  1. 1234 ÷ 16 = 77,余数 2
  2. 77 ÷ 16 = 4,余数 13 (对应十六进制的 D
  3. 4 ÷ 16 = 0,余数 4

将余数逆序排列,得到:
1234_{10} = 4D2_{16}

背景知识:

十六进制 通常用来简化二进制表示,因为一个十六进制数字正好可以表示四个二进制位。计算机中很多底层信息,如内存地址、颜色代码等,都是通过十六进制来表示的。

Java代码手动实现:

java 复制代码
public class DecimalToHexadecimalManual {
    public static String decimalToHexadecimal(int n) {
        StringBuilder hexNum = new StringBuilder();
        char[] hexDigits = "0123456789ABCDEF".toCharArray();
        while (n > 0) {
            hexNum.append(hexDigits[n % 16]);
            n = n / 16;
        }
        return hexNum.reverse().toString();
    }

    public static void main(String[] args) {
        System.out.println(decimalToHexadecimal(1234));  // 输出: 4D2
    }
}

3. 十六进制转十进制(Hexadecimal to Decimal, 16-10) 🖥️

要将 十六进制 转换为 十进制 ,我们使用 权值展开法。将每一位十六进制数乘以16的相应幂次,再将结果相加得到十进制数。

步骤:

  1. 从右向左,每一位乘以 (16) 的相应幂次。
  2. 将结果相加,得到十进制数。

示例:

1A3F_{16} 转换为十进制:

[
1 A 3 F 16 = ( 1 × 1 6 3 ) + ( 10 × 1 6 2 ) + ( 3 × 1 6 1 ) + ( 15 × 1 6 0 ) = 4096 + 2560 + 48 + 15 = 671 9 10 1A3F_{16} = (1 \times 16^3) + (10 \times 16^2) + (3 \times 16^1) + (15 \times 16^0) = 4096 + 2560 + 48 + 15 = 6719_{10} 1A3F16=(1×163)+(10×162)+(3×161)+(15×160)=4096+2560+48+15=671910

]

背景知识:

十六进制的每一位代表的权重是 (16^n),这使得它非常适合表示较大的数,同时可以减少书写的长度。内存地址、汇编语言中的指令都是用十六进制表示的。

Java代码手动实现:

java 复制代码
public class HexadecimalToDecimalManual {
    public static int hexadecimalToDecimal(String hexNum) {
        int decimal = 0;
        int base = 1; // 16^0
        char[] hexDigits = hexNum.toUpperCase().toCharArray();
        int len = hexDigits.length;
        
        for (int i = len - 1; i >= 0; i--) {
            if (hexDigits[i] >= '0' && hexDigits[i] <= '9') {
                decimal += (hexDigits[i] - '0') * base;
            } else if (hexDigits[i] >= 'A' && hexDigits[i] <= 'F') {
                decimal += (hexDigits[i] - 'A' + 10) * base;
            }
            base *= 16;
        }
        
        return decimal;
    }

    public static void main(String[] args) {
        System.out.println(hexadecimalToDecimal("1A3F"));  // 输出: 6719
    }
}

4. 十六进制转二进制(Hexadecimal to Binary, 16-2) 🧑‍💻

十六进制转二进制 非常简单。每一个十六进制数字对应四位二进制数。只需将每位十六进制数字分别转换成四位二进制数,最后将它们拼接起来。

步骤:

  1. 将每一个十六进制位转换为对应的四位二进制数。
  2. 将这些二进制数拼接在一起

,得到最终的二进制结果。

示例:

1A3F_{16} 转换为二进制:

  • 1 = 0001
  • A = 1010
  • 3 = 0011
  • F = 1111

所以:
1A3F_{16} = 0001\ 1010\ 0011\ 1111_2

背景知识:

二进制与十六进制之间的转换非常简便,尤其在处理大型的二进制数据时,十六进制能帮助我们更轻松地表示和阅读数据。许多程序员在调试时经常用到十六进制,因为它可以让复杂的二进制变得更加清晰易读。

Java代码手动实现:

java 复制代码
public class HexadecimalToBinaryManual {
    public static String hexadecimalToBinary(String hexNum) {
        StringBuilder binary = new StringBuilder();
        char[] hexDigits = hexNum.toUpperCase().toCharArray();
        
        for (char hexDigit : hexDigits) {
            switch (hexDigit) {
                case '0': binary.append("0000"); break;
                case '1': binary.append("0001"); break;
                case '2': binary.append("0010"); break;
                case '3': binary.append("0011"); break;
                case '4': binary.append("0100"); break;
                case '5': binary.append("0101"); break;
                case '6': binary.append("0110"); break;
                case '7': binary.append("0111"); break;
                case '8': binary.append("1000"); break;
                case '9': binary.append("1001"); break;
                case 'A': binary.append("1010"); break;
                case 'B': binary.append("1011"); break;
                case 'C': binary.append("1100"); break;
                case 'D': binary.append("1101"); break;
                case 'E': binary.append("1110"); break;
                case 'F': binary.append("1111"); break;
            }
        }
        
        return binary.toString();
    }

    public static void main(String[] args) {
        System.out.println(hexadecimalToBinary("1A3F"));  // 输出: 0001101000111111
    }
}

5. 二进制转十进制(Binary to Decimal, 2-10) 💡

二进制 转换为 十进制 可以使用 权值展开法。二进制的每一位表示 2 的幂次方,通过计算每一位二进制对应的十进制值,并将这些值相加得到最终的十进制结果。

步骤:

  1. 将每个二进制位乘以 2 的幂次方。
  2. 将结果相加,得到十进制数。

示例:

1101101_2 转换为十进制:

[
110110 1 2 = ( 1 × 2 6 ) + ( 1 × 2 5 ) + ( 0 × 2 4 ) + ( 1 × 2 3 ) + ( 1 × 2 2 ) + ( 0 × 2 1 ) + ( 1 × 2 0 ) = 64 + 32 + 0 + 8 + 4 + 0 + 1 = 10 9 10 1101101_2 = (1 \times 2^6) + (1 \times 2^5) + (0 \times 2^4) + (1 \times 2^3) + (1 \times 2^2) + (0 \times 2^1) + (1 \times 2^0) = 64 + 32 + 0 + 8 + 4 + 0 + 1 = 109_{10} 11011012=(1×26)+(1×25)+(0×24)+(1×23)+(1×22)+(0×21)+(1×20)=64+32+0+8+4+0+1=10910

]

背景知识:

二进制 是计算机唯一能直接理解的数字系统。每一个二进制位(bit)都代表一个最小的存储单元,而它的值只能是 0 或 1。

Java代码手动实现:

java 复制代码
public class BinaryToDecimalManual {
    public static int binaryToDecimal(String binaryNum) {
        int decimal = 0;
        int base = 1; // 2^0
        int len = binaryNum.length();
        
        for (int i = len - 1; i >= 0; i--) {
            if (binaryNum.charAt(i) == '1') {
                decimal += base;
            }
            base *= 2;
        }
        
        return decimal;
    }

    public static void main(String[] args) {
        System.out.println(binaryToDecimal("1101101"));  // 输出: 109
    }
}

6. 二进制转十六进制(Binary to Hexadecimal, 2-16) 🔄

二进制转十六进制 的转换方法非常简单,只需将二进制数每四位一组,转换为对应的十六进制数即可。

步骤:

  1. 将二进制数从右往左按四位分组。
  2. 将每组二进制数转换为对应的十六进制数。

示例:

1101101011_2 转换为十六进制:

  1. 从右向左分组:11011011
  2. 转换:
    • 1101 = D
    • 1011 = B

所以:
1101101011_2 = 1DB_{16}

背景知识:

二进制十六进制 之间的转换在计算机系统中非常常见。二进制数非常冗长且不易阅读,而十六进制数能简化表示,同时能保留二进制信息的精确度。

Java代码手动实现:

java 复制代码
public class BinaryToHexadecimalManual {
    public static String binaryToHexadecimal(String binaryNum) {
        StringBuilder hex = new StringBuilder();
        int len = binaryNum.length();
        
        // 补齐长度为4的倍数
        while (len % 4 != 0) {
            binaryNum = "0" + binaryNum;
            len++;
        }
        
        for (int i = 0; i < len; i += 4) {
            String fourBits = binaryNum.substring(i, i + 4);
            switch (fourBits) {
                case "0000": hex.append("0"); break;
                case "0001": hex.append("1"); break;
                case "0010": hex.append("2"); break;
                case "0011": hex.append("3"); break;
                case "0100": hex.append("4"); break;
                case "0101": hex.append("5"); break;
                case "0110": hex.append("6"); break;
                case "0111": hex.append("7"); break;
                case "1000": hex.append("8"); break;
                case "1001": hex.append("9"); break;
                case "1010": hex.append("A"); break;
                case "1011": hex.append("B"); break;
                case "1100": hex.append("C"); break;
                case "1101": hex.append("D"); break;
                case "1110": hex.append("E"); break;
                case "1111": hex.append("F"); break;
            }
        }
        
        return hex.toString();
    }

    public static void main(String[] args) {
        System.out.println(binaryToHexadecimal("1101101011"));  // 输出: 1DB
    }
}

总结 🎯

在这篇博客中,我们通过丰富的例子讲解了六种常见的进制转换 方式:从 十进制到二进制十进制到十六进制 ,再到 二进制、十六进制与十进制之间的转换。掌握这些进制转换技巧不仅有助于理解计算机底层数据的表示,还能帮助你在编程和调试中更加得心应手。

  • 十进制转二进制(10-2):除2取余法
  • 十进制转十六进制(10-16):除16取余法
  • 十六进制转十进制(16-10):权值展开法
  • 十六进制转二进制(16-2):每位对应四位二进制
  • 二进制转十进制(2-10):权值展开法
  • 二进制转十六进制(2-16):每四位二进制对应一位十六进制

进制转换是每个计算机组成原理课程的基础内容,它不仅帮助我们理解计算机如何存储和处理数据,还在编程和系统开发中有着广泛的应用。希望本文能够帮助你深入理解这些关键概念,成为进制转换的高手!💻✨

相关推荐
centos089 小时前
PWN(栈溢出漏洞)-原创小白超详细[Jarvis-level0]
网络安全·二进制·pwn·ctf
Tisfy9 天前
LeetCode 3211.生成不含相邻零的二进制字符串:二进制枚举+位运算优化
算法·leetcode·二进制·题解·枚举·位运算
vortex514 天前
安全见闻(9)——开阔眼界,不做井底之蛙
安全·网络安全·逆向·二进制·1024程序员节
代吗喽1 个月前
深入解析 RISC-V 递归函数的栈使用:以阶乘函数为例
risc-v·计算机组成
Jay 172 个月前
第四届“长城杯”网络安全大赛 暨京津冀网络安全技能竞赛(初赛) 全方向 题解WriteUp
安全·web安全·密码学·二进制·ctf·长城杯·安全杂项
小妖剑2 个月前
位运算:带带孩子吧,孩子很强的!
c++·性能优化·二进制·位运算·cpp
无 双2 个月前
BUUCTF PWN wp--jarvisoj_level0
网络安全·二进制·ctf pwn
00圈圈2 个月前
二进制、十进制转换进阶--小数点后的转换
算法·二进制·十进制·小数点转换
Tisfy3 个月前
LeetCode 3133.数组最后一个元素的最小值:位运算+双指针
算法·leetcode·二进制·题解·位运算·双指针