You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将二进制补位至等长后计算两数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。

解决思路

要解决这个问题,我们可以按以下步骤进行:

  • 对于每一对数ab,先计算它们的二进制位数(用整数内置的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))

代码解释

  1. bit_length()方法:这是Python整数自带的实用方法,比如2.bit_length()返回2(对应二进制10),6.bit_length()返回3(对应二进制110),能直接帮我们拿到二进制的有效长度。
  2. 左移操作:当a的二进制长度比b短2位时,a << 2会把a的二进制末尾补2个零,比如3 << 2得到12(二进制从11变成1100),和10(二进制1010)的长度一致。
  3. 异或操作:用^运算符计算异或,比如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

火山引擎 最新活动