题解
【基础】小 X 与位运算(bignum)
1 条题解
-
0
解题思路
题目要求对两个很大的二进制数做位运算(and、or、xor),结果不能有前导 0。二进制最长 100000 位,所以要用字符串一位一位处理。
思路:
- 对齐长度:两个二进制数长短可能不同,把短的左边补 0,让它们右对齐
- 逐位运算:从最高位到最低位,按运算规则逐位计算
- and:两位都是 1 结果是 1,否则 0
- or:两位都是 0 结果是 0,否则 1
- xor:两位相同结果是 0,不同结果是 1
- 去前导 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