top1编程
← 返回题目
题解

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

1 条题解

  • 0
    @ 2026-7-31 12:01:55

    解题思路

    题目要求把二进制数转换成十六进制数。二进制最长 100 位,不能用普通整数存,要利用规律。

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

    因为 16 = 2⁴,所以 4 位二进制正好表示 0~15,就是 1 位十六进制。

    步骤:

    1. 如果二进制的位数不是 4 的倍数,在左边补 0,让长度变成 4 的倍数
    2. 从左边开始,每 4 位分成一组
    3. 每组单独转成十六进制数字(0~9、A~F)
    4. 连起来输出

    怎么转十六进制字符?

    • 0~9 直接转成数字字符
    • 10~15 要转成 A~F(10→A、11→B……15→F)

    为什么每 4 位一组? 和八进制每 3 位一组同理,因为 16 = 2⁴,所以 4 位二进制对应 1 位十六进制。

    参考代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    char num(string s) {
        int r = 0, t = 1;
        for (int i = s.size() - 1; i >= 0; i--) {
            r += (s[i] - '0') * t;
            t *= 2;
        }
        if (r < 10) return char(r + '0');
        else return char(r - 10 + 'A');
    }
    
    int main() {
        string s;
        cin >> s;
    
        if (s.size() % 4 == 1) s = "0" + s;
        else if (s.size() % 4 == 2) s = "00" + s;
        else if (s.size() % 4 == 3) s = "000" + s;
    
        for (int i = 0; i < s.size(); i += 4) {
            cout << num(s.substr(i, 4));
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),N 为二进制位数
    • 空间复杂度:O(1)
    • 1