跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

算法实战:位运算解决两数之和、唯一数字与缺失数字

位运算技巧在算法解题中至关重要。通过异或和按位与操作模拟无进位加法,可高效计算两数之和;利用比特位统计模三特性,能在线性时间内找出数组中唯一的数字;针对缺失数字问题,结合异或分组策略可将复杂度降至最优。提供 C++ 实现方案,涵盖核心思路解析与代码细节。

奇形怪状发布于 2026/3/22更新于 2026/5/56 浏览
算法实战:位运算解决两数之和、唯一数字与缺失数字

文章配图

35. 两个整数之和

题目链接

371. 两整数之和 - 力扣(LeetCode)

题目描述

文章配图

题目示例

文章配图

解法(位运算)

核心思路

这里我们不用 + 运算符,而是利用位运算模拟加法过程。

  • 异或 ^:本质是【无进位加法】。比如 1 ^ 1 = 0, 1 ^ 0 = 1。
  • 按位与 &:能得到哪些位置产生了进位。但进位需要向高位移动,所以结果要左移 1 位。
  • 循环处理:只要还有进位(即 b 不为 0),就继续将'无进位和'赋值给 a,'进位值'赋值给 b,直到进位消失。
参考代码
class Solution {
public:
    int getSum(int a, int b) {
        // 解法:位运算 (^ 异或:无进位相加)
        while (b) {
            int x = a ^ b;          // 计算无进位和
            int y = (a & b) << 1;   // 计算进位并左移
            a = x;
            b = y;                  
        }
         a;
    }
};
// 更新 a 和 b,准备下一轮
return
流程解析

文章配图


36. 只出现一次的数字 II

题目链接

137. 只出现一次的数字 II - 力扣(LeetCode)

题目描述

文章配图

题目示例

文章配图

解法(比特位计数)

核心思路

这道题要求找出数组中只出现一次的数字,其余数字都出现了三次。

我们可以从二进制的角度思考:对于任意一个比特位,如果所有数字在该位上为 1 的总次数能被 3 整除,说明目标数字在该位上是 0;否则,目标数字在该位上是 1。

通过遍历 32 个比特位,统计每一位上 1 出现的次数并对 3 取模,就能还原出目标数字的二进制表示。

参考代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0; // 作为位图,存储最终结果
        for (int i = 0; i < 32; i++) { // 依次检查每一个比特位
            int sum = 0;
            for (int x : nums) {
                // 累加当前位上的值
                sum += ((nums[x] >> i) & 1);
            }
            // 如果该位 1 的个数不是 3 的倍数,则目标数字该位为 1
            ret |= ((sum % 3) << i);
        }
        return ret;
    }
};
流程解析

文章配图


38. 消失的两个数字

题目链接

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

题目描述

文章配图

题目示例

文章配图

解法(位运算)

核心思路

这道题可以看作是'丢失的数字'与'只出现一次的数字 III'的结合体。

  1. 整体异或:将数组中的所有数,与区间 [1, n+2] 内的所有数进行异或。因为除了两个消失的数字外,其他数字都出现了两次(一次在数组,一次在区间),异或后都会抵消为 0。剩下的结果就是两个消失数字的异或值 ret = a ^ b。
  2. 分组策略:由于 a 不等于 b,ret 中至少有一位是 1。找到这个最右侧的 1,它意味着 a 和 b 在这一位上不同(一个为 0,一个为 1)。
  3. 分别求解:根据这一位是 0 还是 1,将所有数字分成两组。分别对两组进行异或,每一组中都会剩下一个消失的数字。
参考代码
class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int ret = 0;
        int a = 0;
        int b = 0;

        // 第一步:计算两个消失数字的异或值
        for (int num : nums) {
            ret ^= num;
        }
        for (int i = 1; i <= nums.size() + 2; i++) {
            ret ^= i;
        }

        // 第二步:找到 ret 中最右侧为 1 的比特位
        int x = 0;
        while (((ret >> x) & 1) == 0) {
            x++;
        }

        // 第三步:根据第 x 位分组异或
        for (int num : nums) {
            if (((num >> x) & 1) == 0) {
                a ^= num;
            } else {
                b ^= num;
            }
        }
        for (int i = 1; i <= nums.size() + 2; i++) {
            if (((i >> x) & 1) == 0) {
                a ^= i;
            } else {
                b ^= i;
            }
        }

        return {a, b};
    }
};
流程解析

文章配图

目录

  1. 35. 两个整数之和
  2. 题目链接
  3. 题目描述
  4. 题目示例
  5. 解法(位运算)
  6. 核心思路
  7. 参考代码
  8. 流程解析
  9. 36. 只出现一次的数字 II
  10. 题目链接
  11. 题目描述
  12. 题目示例
  13. 解法(比特位计数)
  14. 核心思路
  15. 参考代码
  16. 流程解析
  17. 38. 消失的两个数字
  18. 题目链接
  19. 题目描述
  20. 题目示例
  21. 解法(位运算)
  22. 核心思路
  23. 参考代码
  24. 流程解析
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • C++ 模板进阶:非类型参数与特化详解
  • 解决新机型 Copilot 键替代右 Ctrl 键问题
  • node-llama-cpp 错误处理与调试:本地 AI 开发常见问题
  • Spark 离线开发框架设计与实现
  • Cursor 集成 MCP 服务:从配置到实战
  • C++ 面向对象编程:深入解析继承机制
  • 睿抗机器人大赛 Oryxbot 仿真环境搭建及 Python 任务控制脚本
  • 医学影像分类器:基于深度学习的肺结节检测
  • 【Vue3】前端Vue3最常用的 20 道面试题总结(含详细代码解析)
  • 后仿 SDF 反标 Warning 描述与解决方案
  • 提示词、Agent、MCP、Skill 详解:AI 核心概念解析
  • Claude Agent Skills 入门与实战:面向 Web 全栈开发者
  • 基于 AutoGen 构建多智能体互动对话系统
  • AI Agent 中的 Skills 概念与作用
  • Python APP 反爬实战:Frida+Charles 抓包与签名校验破解
  • Windows 11 双网卡同时访问内网和外网:静态路由配置全指南
  • Komari 轻量级服务器监控工具介绍
  • 黑词分析前端组件设计:双面板交互与进度监控
  • Ng-Zorro DatePicker 禁用周末及部分时间配置
  • Ubuntu 24.04 搭建 OpenHarmony PC 命令行移植开发环境

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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