二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。现在小C想知道,给定一个十进制数 N,它的二进制反码对应的十进制数是多少。
测试样例
样例1:
输入:
N = 5
输出:2
样例2:
输入:
N = 10
输出:5
样例3:
输入:
N = 0
输出:1
思路
算法步骤
- 特殊情况处理:如果
N为0,直接返回1,因为0的二进制反码是1。 - 构造掩码:我们需要构造一个掩码,这个掩码的二进制表示中,
N的最高位到最低位都是1。例如,如果N是5(二进制101),那么掩码应该是111。 - 按位取反:使用按位异或操作
^来实现反码操作。N ^ mask会将N的每一位取反。
具体步骤
- 初始化掩码:从
N的最高位开始,逐步构造掩码。 - 右移
N:每次右移N一位,直到N变为0。 - 构造掩码:每次右移
N时,将掩码左移一位并加上1。 - 按位取反:使用
N ^ mask得到反码后的结果。
代码展示
int solution(int N) {
if (N == 0) {
return 1; // 特殊情况
}
// 计算掩码
int mask = 0;
int temp = N;
while (temp > 0) {
mask = (mask << 1) | 1; // 构造全 1 掩码
temp >>= 1; // 右移一位
}
// 按位取反
return N ^ mask;
}
int main() {
std::cout << (solution(5) == 2) << std::endl; // 输出 1
std::cout << (solution(10) == 5) << std::endl; // 输出 1
std::cout << (solution(0) == 1) << std::endl; // 输出 1
return 0;
}
代码逻辑
-
特殊情况处理:
- 如果
N为0,直接返回1。
- 如果
-
计算掩码:
- 初始化
mask为0。 - 使用
temp变量来存储N的值,并逐步右移temp,直到temp变为0。 - 在每次右移
temp时,将mask左移一位并加上1,从而构造一个全1的掩码。
- 初始化
-
按位取反:
- 使用
N ^ mask来实现按位取反操作,得到反码后的结果。
- 使用
代码正确性
- 特殊情况处理:代码正确处理了
N = 0的情况。 - 掩码构造:代码正确地构造了一个全
1的掩码,掩码的长度与N的二进制表示长度相同。 - 按位取反:代码正确地使用了按位异或操作来实现反码。
测试样例
solution(5)应该返回2,代码输出1,表示正确。solution(10)应该返回5,代码输出1,表示正确。solution(0)应该返回1,代码输出1,表示正确。
代码说明:
- 特殊情况处理:
- 如果
N为 0,则返回 1(其二进制为0,反码为1)。
- 如果
- 掩码构造:
- 用
mask构造与N二进制位数相同且全为1的掩码。例如,N = 5 (101)的掩码是111。
- 用
- 按位取反:
N ^ mask将N的所有位按位取反,得到其二进制反码。