跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

算法实战:位运算解决整数求和与缺失数字问题

位运算技巧在算法题中应用广泛。通过三个典型例题讲解如何利用异或、按位与及比特位计数解决实际问题。首先利用异或和无进位加法模拟整数求和,避免使用算术运算符;其次通过统计二进制位出现次数模 3 来定位唯一数字;最后结合异或性质将缺失数字问题转化为分组查找。这些方法不仅时间复杂度低,还能有效降低空间占用,适合面试高频考点。

云间运维发布于 2026/3/21更新于 2026/6/419 浏览
算法实战:位运算解决整数求和与缺失数字问题

算法实战:位运算解决整数求和与缺失数字问题

35. 两个整数之和

题目描述

不使用 + 或 - 运算符,计算两个整数的和。

文章配图

示例

输入:a = 1, b = 2 输出:3

核心思路:位运算解法

这道题的核心在于理解计算机底层是如何做加法的。我们可以把加法拆解为两部分:无进位相加和进位。

  1. 无进位和:使用异或运算 ^。比如 1 ^ 2 得到 3,这相当于不考虑进位的二进制加法。
  2. 进位值:使用按位与 & 并左移一位 << 1。只有当两个位都是 1 时才会产生进位,且进位要加到更高一位上。
  3. 循环处理:将无进位和作为新的 a,进位值作为新的 b,重复上述过程,直到进位为 0,此时 a 就是最终结果。

代码实现

class Solution {
public:
    int getSum(int a, int b) {
        // 当进位不为 0 时继续循环
        while (b != 0) {
            // 无进位相加的结果
            int sumWithoutCarry = a ^ b;
            // 计算进位位置,需要左移一位
            int carry = (unsigned int)(a & b) << 1;
            
            a = sumWithoutCarry;
            b = carry;
        }
        return a;
    }
};

注意:在 C++ 中,对有符号整数进行位移操作可能涉及未定义行为,这里为了安全起见,计算进位时建议先转为无符号类型再移位,或者确保逻辑符合补码规则。上面的逻辑在 LeetCode 环境下是安全的,但实际工程中需注意溢出边界。

流程解析

文章配图


36. 只出现一次的数字 II

题目描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

文章配图

示例

输入:[2, 2, 3, 2] 输出:3

核心思路:比特位计数

既然其他数字都出现了三次,那么对于任意一个二进制位(bit),如果该位上的 1 被统计起来,其总和一定是 3 的倍数加上那个唯一数字在该位上的值(0 或 1)。

因此,我们只需要遍历所有数字的每一个二进制位,统计该位上 1 出现的总次数。对 3 取余,剩下的就是目标数字在该位上的值。通过这种方式还原出每一位,就能拼凑出完整的数字。

代码实现

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        // 遍历 32 位整数的每一位
        for (int i = 0; i < 32; i++) {
            int sum = 0;
            // 统计当前位上 1 的个数
            for (int x : nums) {
                sum += ((x >> i) & 1);
            }
            // 如果某一位的 1 的个数不是 3 的倍数,说明目标数字在这一位上是 1
            if (sum % 3 != 0) {
                ret |= (1 << i);
            }
        }
        return ret;
    }
};

流程解析

文章配图


38. 消失的两个数字

题目描述

给定一个包含从 0 到 n 的所有整数中缺失了两个数字的数组,找出这两个缺失的数字。

文章配图

示例

输入:nums = [1, 0] 输出:[2, 3] (顺序不限)

核心思路:分组异或

这个问题可以看作是'丢失的数字'和'只出现一次的数字 III'的结合版。

  1. 整体异或:将数组中的所有数与 [1, n+2] 范围内的所有数进行异或。由于成对的数会抵消,最后得到的结果 ret 等于两个缺失数字的异或值(a ^ b)。
  2. 区分两组:因为 a 和 b 不同,所以 ret 中至少有一位是 1。找到这个最右侧的 1 所在的位 x。
  3. 分组异或:根据第 x 位是 0 还是 1,将所有数字分成两组。这样 a 和 b 必然会被分到不同的组中,而其他成对的数会在同一组内互相抵消。分别对两组进行异或,即可得到 a 和 b。

代码实现

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int ret = 0;
        // 第一步:计算所有数字与完整序列的异或结果
        for (int num : nums) {
            ret ^= num;
        }
        for (int i = 1; i <= nums.size() + 2; i++) {
            ret ^= i;
        }
        // 此时 ret = a ^ b
        
        // 第二步:找到 ret 中最右侧为 1 的位
        int diffBit = 0;
        while (((ret >> diffBit) & 1) == 0) {
            diffBit++;
        }
        
        int a = 0, b = 0;
        // 第三步:根据该位分组异或
        for (int num : nums) {
            if ((num >> diffBit) & 1) {
                a ^= num;
            } else {
                b ^= num;
            }
        }
        for (int i = 1; i <= nums.size() + 2; i++) {
            if ((i >> diffBit) & 1) {
                a ^= i;
            } else {
                b ^= i;
            }
        }
        
        return {a, b};
    }
};

流程解析

文章配图

目录

  1. 算法实战:位运算解决整数求和与缺失数字问题
  2. 35. 两个整数之和
  3. 题目描述
  4. 示例
  5. 核心思路:位运算解法
  6. 代码实现
  7. 流程解析
  8. 36. 只出现一次的数字 II
  9. 题目描述
  10. 示例
  11. 核心思路:比特位计数
  12. 代码实现
  13. 流程解析
  14. 38. 消失的两个数字
  15. 题目描述
  16. 示例
  17. 核心思路:分组异或
  18. 代码实现
  19. 流程解析
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Swift Composable Architecture 大型 SwiftUI 应用架构实践
  • 动态规划:路径问题
  • 使用 ChatGPT 降低毕业论文 AIGC 检测率的策略
  • C++ STL 算法深度解析:从基础到 C++20 Ranges
  • 基于 YOLOv8 的无人机道路损伤检测系统:四类裂缝与坑洼识别
  • Conda 与 Python 版本管理实战指南
  • Manual2Skill:利用 VLM 阅读说明书指导机器人家具组装
  • 二维云台激光打靶系统设计:基于 STM32F407 与视觉伺服控制
  • Python 零基础学习经验总结与入门技术指南
  • 基于 AI 的全栈开发新路径:自动生成 UI 设计稿与 H5 原型
  • 5 种主流深度生成模型对比:VAE、GAN、AR、Flow 与 Diffusion 原理及实现
  • 2026 年前端面试核心场景与工程化能力梳理
  • C++ 继承核心机制详解
  • Unity3D 粒子系统核心模块实战:Velocity、Noise 与生命周期控制
  • C++ 继承机制详解:实现栈、同名隐藏与派生类默认成员函数
  • Amazon SageMaker 部署 AIGC 应用:训练优化及 Web 前端集成实践
  • Milvus 向量数据库实战:Attu 可视化安装与 Python 整合指南
  • 命令行大模型交互工具 MCPHost 配置与实战指南
  • 电商产品 AI 绘画:高效提示词撰写实战指南
  • 算法基础:分治法核心思想与经典例题解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online