top1编程
← 返回题目
题解

【基础】小 X 与位运算(bignum)

1 条题解

  • 0
    @ 2026-7-31 14:15:10

    解题思路

    题目要求对两个很大的二进制数做位运算(and、or、xor),结果不能有前导 0。二进制最长 100000 位,所以要用字符串一位一位处理。

    思路:

    1. 对齐长度:两个二进制数长短可能不同,把短的左边补 0,让它们右对齐
    2. 逐位运算:从最高位到最低位,按运算规则逐位计算
      • and:两位都是 1 结果是 1,否则 0
      • or:两位都是 0 结果是 0,否则 1
      • xor:两位相同结果是 0,不同结果是 1
    3. 去前导 0:结果前面如果有一串 0,都去掉;如果全是 0 就保留一个 0

    为什么要补 0 对齐? 位运算是从最高位对齐的,两个数位数不同,短的左边补 0 后才能逐位对应。

    举例:110100 or 11001

    • 补 0 对齐:110100 和 011001
    • 逐位 or:111101

    参考代码

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int main() {
        string a, b, op;
        cin >> a >> b >> op;
    
        // 短的补 0 对齐
        int max_len = max(a.size(), b.size());
        while (a.size() < max_len) a = "0" + a;
        while (b.size() < max_len) b = "0" + b;
    
        string res;
        for (int i = 0; i < max_len; i++) {
            char ca = a[i], cb = b[i];
            if (op == "and") {
                res += (ca == '1' && cb == '1') ? '1' : '0';
            } else if (op == "or") {
                res += (ca == '1' || cb == '1') ? '1' : '0';
            } else if (op == "xor") {
                res += (ca != cb) ? '1' : '0';
            }
        }
    
        // 去前导 0
        int start = 0;
        while (start < res.size() && res[start] == '0') start++;
        if (start == res.size()) {
            cout << "0" << endl;
        } else {
            cout << res.substr(start) << endl;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),N 为二进制长度
    • 空间复杂度:O(N),存结果
    • 1