问题描述
小C在学习二进制运算,他了解到每个非负整数都有其二进制表示。例如,整数 5 可以被表示为二进制 "101",整数 11 可以被表示为二进制 "1011",并且除了 N = 0 外,任何二进制表示中都不含前导零。
二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。现在小C想知道,给定一个十进制数 N,它的二进制反码对应的十进制数是多少。
测试样例
样例1:
输入:
N = 5
输出:2
样例2:
输入:
N = 10
输出:5
样例3:
输入:
N = 0
输出:1
问题理解
我们需要将一个十进制数 N 转换为其二进制表示,然后求出该二进制表示的反码,最后将反码转换回十进制数。
关键点
- 二进制表示:将十进制数
N转换为二进制字符串。 - 反码:将二进制字符串中的
1变为0,0变为1。 - 转换回十进制:将反码后的二进制字符串转换回十进制数。
思路
- 特殊情况处理:当
N为0时,其反码为1。 - 获取二进制长度:使用
N.bit_length()获取N的二进制表示的长度。 - 生成全1的二进制数:通过
(1 << bit_length) - 1生成一个与N二进制表示长度相同的全1的二进制数。 - 异或运算:通过
N ^ all_ones得到N的二进制反码对应的十进制数。
示例:
假设 :
- 二进制表示:
101 - 反码:
010 - 反码对应的十进制:
因此,5 的二进制反码在十进制下是 2
Solutinon
基于以上思想,还有豆包Marscode小助手提供的提示,我们可以轻松的写出Solution代码:
def solution(N: int) -> int:
if N == 0:
return 1
bit_length = N.bit_length()
all_ones = (1 << bit_length) - 1
return N ^ all_ones
注意事项:
注意,要想完全100%解决这道题还需要以下注意事项噢:
-
特殊情况处理:
- 当
N = 0时,二进制反码对应的十进制数是1。这是因为0的二进制表示是"0",其反码是"1",对应的十进制数是1。
- 当
-
二进制表示的长度:
- 需要确定
N的二进制表示的长度。可以使用N.bit_length()来获取N的二进制表示的位数。
- 需要确定
-
生成全1的二进制数:
- 为了生成与
N的二进制表示长度相同的全1的二进制数,可以使用(1 << bit_length) - 1。
- 为了生成与
-
异或运算:
- 通过异或运算
N ^ all_ones可以得到N的二进制反码对应的十进制数。
- 通过异或运算