题目解析
题目要求:
给定一个十进制数 N,计算它的二进制反码对应的十进制数。
关键点:
- 每个非负整数都有其二进制表示,且不含前导零(N=0 除外,但这里的“不含前导零”实际上对 N=0 没有影响,因为 0 的二进制表示就是 "0")。
- 二进制反码是将每个二进制位上的 1 变为 0,每个 0 变为 1。
思路:
- 将十进制数 N 转换为二进制字符串。
- 遍历二进制字符串,对每个二进制位进行反码操作(即 0 变 1,1 变 0)。
- 将反码后的二进制字符串转换回十进制数。
然而,直接操作二进制字符串进行逐位反码虽然直观,但效率较低。我们可以利用整数运算的异或(XOR)操作来高效地实现这一点。
异或操作的特点:
- a⊕0=a(任何数与 0 异或还是它本身)
- a⊕1=NOT a(任何数与 1 异或相当于对该数进行逐位取反)
- 异或操作满足交换律和结合律。
对于二进制数 N,我们可以构造一个与其二进制表示长度相同且全为 1 的数 M,然后计算 N⊕M,得到的就是 N 的二进制反码对应的十进制数。
图解(以 N=5 为例):
- N=5 的二进制表示为 "101"。
- 构造一个与 "101" 长度相同且全为 1 的二进制数 "111"(十进制表示为 7)。
- 计算 5⊕7=2。
- "101" 的二进制反码是 "010",对应的十进制数是 2。
代码详解
python复制代码
def decimal_to_binary_inverse(N: int) -> int:
# 计算与 N 的二进制表示长度相同且全为 1 的二进制数对应的十进制数
# 例如,N = 5(二进制 "101"),则长度为 3,全 1 二进制数为 "111"(十进制 7)
# 可以通过 (1 << length) - 1 来计算,其中 length 是 N 的二进制表示的位数
length = N.bit_length() # 获取 N 的二进制表示的位数(不包括前导零)
mask = (1 << length) - 1 # 构造一个长度为 length 的全 1 二进制数对应的十进制数
# 使用异或操作计算反码对应的十进制数
inverse_decimal = N ^ mask
return inverse_decimal
# 测试
print(decimal_to_binary_inverse(5)) # 输出 2
print(decimal_to_binary_inverse(10)) # 输出 5
print(decimal_to_binary_inverse(0)) # 输出 1,注意 0 的特殊情况,但这里的实现也正确
在这个实现中,我们使用了 N.bit_length() 来获取 N 的二进制表示的位数(不包括前导零),然后构造了一个与 N 长度相同且全为 1 的二进制数对应的十进制数 mask。最后,我们通过异或操作 N ^ mask 计算出了 N 的二进制反码对应的十进制数。这种方法比直接操作二进制字符串更加高效且简洁。