将二进制补位至等长后计算两数XOR的问题求解
解决两个数补位后异或的问题
问题描述
计算两个数a和b在将较小数的二进制表示补尾随零至与较大数二进制长度相等后的XOR(异或)值。输入:第一行输入整数T表示测试用例数,每个测试用例输入两个整数a和b。输出:每个测试用例输出补位后两数的异或结果。约束条件:1<=T<=100,1<=a,b<=10^7。
示例:输入:4 2 6 3 10 5 24 1 20;输出:2 6 12 4。
解释:1. 2的二进制是10,6的二进制是110,将10补一个尾零变为100,再与110异或得到10即2。
解决思路
要解决这个问题,我们可以按以下步骤进行:
- 对于每一对数
a和b,先计算它们的二进制位数(用整数内置的bit_length()方法,该方法返回二进制表示中最高位1的位置,也就是二进制的有效长度)。 - 对比两个数的二进制长度,计算长度差
diff。 - 将较短的数左移
diff位(左移n位等价于乘以2^n,效果就是在二进制末尾补n个零),使其二进制长度与较长的数匹配。 - 计算左移后的数与原较长数的异或值,得到最终结果。
代码实现(Python)
def compute_padded_xor(a, b): len_a = a.bit_length() len_b = b.bit_length() # 把较短的数补零到和较长数同长度 if len_a < len_b: a <<= (len_b - len_a) elif len_b < len_a: b <<= (len_a - len_b) # 计算异或 return a ^ b # 处理输入输出逻辑 T = int(input()) results = [] for _ in range(T): a, b = map(int, input().split()) results.append(str(compute_padded_xor(a, b))) print(' '.join(results))
代码解释
bit_length()方法:这是Python整数自带的实用方法,比如2.bit_length()返回2(对应二进制10),6.bit_length()返回3(对应二进制110),能直接帮我们拿到二进制的有效长度。- 左移操作:当
a的二进制长度比b短2位时,a << 2会把a的二进制末尾补2个零,比如3 << 2得到12(二进制从11变成1100),和10(二进制1010)的长度一致。 - 异或操作:用
^运算符计算异或,比如12 ^ 10等于6(二进制1100 ^ 1010 = 0110),和示例中的结果完全匹配。
验证示例
我们用题目给出的测试用例逐一验证:
- 测试用例1:a=2,b=6 → len_a=2,len_b=3 → a左移1位变成4 → 4^6=2 ✔️
- 测试用例2:a=3(二进制
11,长度2),b=10(二进制1010,长度4) → a左移2位变成12 → 12^10=6 ✔️ - 测试用例3:a=5(
101,长度3),b=24(11000,长度5) → a左移2位变成20 → 20^24=12 ✔️ - 测试用例4:a=1(
1,长度1),b=20(10100,长度5) → a左移4位变成16 →16^20=4 ✔️
所有结果都和题目给出的输出一致。
内容的提问来源于stack exchange,提问作者Tarun Jha




