top1编程
← 返回题目
题解

【基础】十六进制转二进制

1 条题解

  • 0
    @ 2026-7-31 14:25:59

    解题思路

    题目要求把十六进制数转换成二进制数。十六进制最长 100 位,不能先转成十进制(太大,long long 都装不下),要利用规律。

    核心规律:十六进制的 1 位,正好对应二进制的 4 位。

    因为 16 = 2⁴,所以每个十六进制数字都能直接查表转成 4 位二进制。

    步骤:

    1. 准备一个表,存 0~15 对应的 4 位二进制
    2. 把十六进制数的每一位转成 4 位二进制,依次拼起来
    3. 去掉前导 0(如果全是 0 就输出一个 0)

    举例 十六进制 A:A 是 10,对应的 4 位二进制是 1010。所以十六进制 A 转成二进制就是 1010。

    为什么不用先转十进制? 因为十六进制太长时十进制会超过 long long 的范围,溢出出错。直接一位转 4 位最安全。

    参考代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        string t[16] = {"0000","0001","0010","0011","0100","0101","0110","0111",
                        "1000","1001","1010","1011","1100","1101","1110","1111"};
        string s, r;
        cin >> s;
    
        for (int i = 0; i < s.size(); i++) {
            int x;
            if (s[i] >= '0' && s[i] <= '9') x = s[i] - '0';
            else x = s[i] - 'A' + 10;
            r += t[x];  // 每位十六进制转 4 位二进制
        }
    
        // 去前导 0
        int p = 0;
        while (p < r.size() && r[p] == '0') p++;
        if (p == r.size()) cout << 0;
        else cout << r.substr(p);
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),N 为十六进制位数
    • 空间复杂度:O(N),存二进制字符串
    • 1