题目描述
每个非负整数都有其二进制表示。例如,整数
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)后得到的结果。
-
处理特殊情况:
- 如果 N 等于 0,直接返回 1。这是因为 0 的二进制表示全为 0,其一位补码全为 1,在二进制下表示为 −1 的补码形式(但这里我们只关心其无符号的十进制值,即 1)。然而,在大多数计算机系统中,0 的一位补码仍然是 0(在补码表示法中,-0 和 +0 被视为相同,即 0),但这里特殊处理为返回 1,可能是为了简化逻辑或满足特定需求。
-
将 N 转换为二进制字符串:
- 使用
bin(N)函数将整数 N 转换为二进制字符串,该字符串以'0b'开头,表示这是一个二进制数。通过[2:]切片操作去掉'0b'前缀,只保留纯二进制表示。
- 使用
-
生成反码:
- 遍历二进制字符串中的每一位,使用列表推导式生成一个新的字符串,其中原字符串中的
'0'变为'1','1'变为'0'。这个新字符串就是原数的一位补码(反码)的二进制表示。
- 遍历二进制字符串中的每一位,使用列表推导式生成一个新的字符串,其中原字符串中的
-
将反码的二进制字符串转换为十进制数:
- 使用
int(complement_binary, 2)函数将反码的二进制字符串转换回十进制数。这里,2表示字符串是二进制格式的。
- 使用
-
返回结果:
- 返回计算得到的十进制数,即 N 的一位补码对应的十进制值。
-
测试:
- 在
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)将反码字符串转换为十进制数并返回。
总结:这段代码通过二进制字符串操作实现了计算一个整数的一位补码(反码)的功能,并通过几个测试用例验证了其正确性。