二进制反码转换问题|豆包MarsCodeAI刷题

95 阅读3分钟

题目解析

题目要求
给定一个十进制数 N,计算它的二进制反码对应的十进制数。

关键点

  1. 每个非负整数都有其二进制表示,且不含前导零(N=0 除外,但这里的“不含前导零”实际上对 N=0 没有影响,因为 0 的二进制表示就是 "0")。
  2. 二进制反码是将每个二进制位上的 1 变为 0,每个 0 变为 1。

思路

  1. 将十进制数 N 转换为二进制字符串。
  2. 遍历二进制字符串,对每个二进制位进行反码操作(即 0 变 1,1 变 0)。
  3. 将反码后的二进制字符串转换回十进制数。

然而,直接操作二进制字符串进行逐位反码虽然直观,但效率较低。我们可以利用整数运算的异或(XOR)操作来高效地实现这一点。

异或操作的特点

  • a⊕0=a(任何数与 0 异或还是它本身)
  • a⊕1=NOT a(任何数与 1 异或相当于对该数进行逐位取反)
  • 异或操作满足交换律和结合律。

对于二进制数 N,我们可以构造一个与其二进制表示长度相同且全为 1 的数 M,然后计算 N⊕M,得到的就是 N 的二进制反码对应的十进制数。

图解(以 N=5 为例):

  1. N=5 的二进制表示为 "101"。
  2. 构造一个与 "101" 长度相同且全为 1 的二进制数 "111"(十进制表示为 7)。
  3. 计算 5⊕7=2。
  4. "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 的二进制反码对应的十进制数。这种方法比直接操作二进制字符串更加高效且简洁。