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

136 阅读2分钟

二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。现在小C想知道,给定一个十进制数 N,它的二进制反码对应的十进制数是多少。


测试样例

样例1:

输入:N = 5
输出:2

样例2:

输入:N = 10
输出:5

样例3:

输入:N = 0
输出:1

思路

算法步骤

  1. 特殊情况处理:如果 N 为 0,直接返回 1,因为 0 的二进制反码是 1
  2. 构造掩码:我们需要构造一个掩码,这个掩码的二进制表示中,N 的最高位到最低位都是 1。例如,如果 N 是 5(二进制 101),那么掩码应该是 111
  3. 按位取反:使用按位异或操作 ^ 来实现反码操作。N ^ mask 会将 N 的每一位取反。

具体步骤

  1. 初始化掩码:从 N 的最高位开始,逐步构造掩码。
  2. 右移 N:每次右移 N 一位,直到 N 变为 0
  3. 构造掩码:每次右移 N 时,将掩码左移一位并加上 1
  4. 按位取反:使用 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;
}

代码逻辑

  1. 特殊情况处理

    • 如果 N 为 0,直接返回 1
  2. 计算掩码

    • 初始化 mask 为 0
    • 使用 temp 变量来存储 N 的值,并逐步右移 temp,直到 temp 变为 0
    • 在每次右移 temp 时,将 mask 左移一位并加上 1,从而构造一个全 1 的掩码。
  3. 按位取反

    • 使用 N ^ mask 来实现按位取反操作,得到反码后的结果。

代码正确性

  • 特殊情况处理:代码正确处理了 N = 0 的情况。
  • 掩码构造:代码正确地构造了一个全 1 的掩码,掩码的长度与 N 的二进制表示长度相同。
  • 按位取反:代码正确地使用了按位异或操作来实现反码。

测试样例

  • solution(5) 应该返回 2,代码输出 1,表示正确。
  • solution(10) 应该返回 5,代码输出 1,表示正确。
  • solution(0) 应该返回 1,代码输出 1,表示正确。

代码说明:

  1. 特殊情况处理
    • 如果 N 为 0,则返回 1(其二进制为 0,反码为 1)。
  2. 掩码构造
    • mask 构造与 N 二进制位数相同且全为 1 的掩码。例如,N = 5 (101) 的掩码是 111
  3. 按位取反
    • N ^ maskN 的所有位按位取反,得到其二进制反码。