1. 问题理解与需求分析
1.1 什么是补数?
在计算机科学中,补数(Complement)是一个基础但重要的概念。对于一个整数的二进制表示,其补数就是将该数的每一位二进制数字取反(0变1,1变0)后得到的新数。例如:
- 十进制数5的二进制表示是101,其补数为010,即十进制数2
- 十进制数7的二进制表示是111,其补数为000,即十进制数0
- 十进制数10的二进制表示是1010,其补数为0101,即十进制数5
1.2 问题约束条件
题目给出了明确的约束条件:
- 输入整数n的范围:0 ≤ n < 10^9
- 需要返回n的补数
- 特别地,当n=0时,返回1(因为0的二进制表示是0,补数为1)
注意:在实际编程中,处理边界条件(如n=0)非常重要,这往往是算法正确性的关键。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解决方案设计思路
2.1 核心算法原理
解决这个问题的关键在于如何高效地找到一个与输入数字n位数相同的全1掩码(mask),然后通过异或(XOR)操作实现位翻转。具体步骤如下:
- 计算n的二进制位数
- 创建一个与n位数相同的全1掩码
- 对n和掩码进行异或操作,得到补数
2.2 为什么使用异或操作?
异或操作(XOR)有一个重要特性:对于任何位x,x ^ 1 = ~x(即取反)。因此:
- 0 ^ 1 = 1
- 1 ^ 1 = 0
这正是我们需要的补数操作。通过创建一个与n位数相同的全1掩码,然后与n进行异或,就能高效地得到n的补数。
2.3 掩码生成方法
掩码的生成是算法的核心部分。我们可以通过以下步骤创建掩码:
- 初始化mask为0
- 将mask左移1位,然后与1进行或操作
- 重复上述步骤,直到覆盖n的所有有效位
例如,对于n=5(二进制101):
- 初始mask=0
- 第一次循环:mask=(0<<1)|1=1
- 第二次循环:mask=(1<<1)|1=11
- 第三次循环:mask=(11<<1)|1=111
- 最终mask=111(二进制),即十进制7
3. 代码实现详解
3.1 完整代码实现
c复制int bitwiseComplement(int n) {
if (n == 0) return 1;
