python实现二进制反码转换 | 豆包MarsCode AI刷题

74 阅读3分钟

题目描述

每个非负整数都有其二进制表示。例如,整数 5 可以被表示为二进制 "101",整数 11 可以被表示为二进制 "1011",并且除了 N = 0 外,任何二进制表示中都不含前导零。 二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。给定一个十进制数 N,它的二进制反码对应的十进制数是多少。

下面是如何实现这个步骤的Python代码:

代码

def solution(N: int) -> int:
    # write code here
    if N == 0:
        return 1
    
    # 将 N 转换为二进制字符串(去掉 '0b' 前缀)
    binary_representation = bin(N)[2:]
    
    # 生成反码
    complement_binary = ''.join('1' if bit == '0' else '0' for bit in binary_representation)
    
    # 将反码的二进制字符串转换为十进制数
    complement_decimal = int(complement_binary, 2)
    
    return complement_decimal

if __name__ == '__main__':
    print(solution(N=5) == 2)
    print(solution(N=10) == 5)
    print(solution(N=0) == 1)

解释说明:

该题目的目的是计算一个非负整数 N 的一位补码(也叫反码)对应的十进制值。一位补码是指将一个数的所有二进制位进行翻转(0变为1,1变为0)后得到的结果。

  1. 处理特殊情况

    • 如果 N 等于 0,直接返回 1。这是因为 0 的二进制表示全为 0,其一位补码全为 1,在二进制下表示为 −1 的补码形式(但这里我们只关心其无符号的十进制值,即 1)。然而,在大多数计算机系统中,0 的一位补码仍然是 0(在补码表示法中,-0 和 +0 被视为相同,即 0),但这里特殊处理为返回 1,可能是为了简化逻辑或满足特定需求。
  2. 将 N 转换为二进制字符串

    • 使用 bin(N) 函数将整数 N 转换为二进制字符串,该字符串以 '0b' 开头,表示这是一个二进制数。通过 [2:] 切片操作去掉 '0b' 前缀,只保留纯二进制表示。
  3. 生成反码

    • 遍历二进制字符串中的每一位,使用列表推导式生成一个新的字符串,其中原字符串中的 '0' 变为 '1''1' 变为 '0'。这个新字符串就是原数的一位补码(反码)的二进制表示。
  4. 将反码的二进制字符串转换为十进制数

    • 使用 int(complement_binary, 2) 函数将反码的二进制字符串转换回十进制数。这里,2 表示字符串是二进制格式的。
  5. 返回结果

    • 返回计算得到的十进制数,即 N 的一位补码对应的十进制值。
  6. 测试

    • 在 if __name__ == '__main__': 块中,通过几个测试用例来验证函数的正确性。例如,solution(N=5) 应该返回 2,因为 5 的二进制表示是 '101',其一位补码是 '010',对应的十进制数是 2。

需要注意的是:

  • bin(N)[2:] 用于获取去掉 '0b' 前缀的二进制字符串。
  • 使用字符串生成式 ''.join('1' if bit == '0' else '0' for bit in binary_representation) 来构建反码。
  • 最后使用 int(complement_binary, 2) 将反码字符串转换为十进制数并返回。

总结:这段代码通过二进制字符串操作实现了计算一个整数的一位补码(反码)的功能,并通过几个测试用例验证了其正确性。