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

算法实战:位运算解法详解(两数之和、唯一数字、缺失数字)

位运算在算法优化中极具价值,通过三道典型题目演示其应用。首先使用异或和按位与模拟加法器,循环处理进位完成整数求和;其次统计所有数字各二进制位总和模三,还原仅出现一次的数值;最后将数组与完整序列异或,利用分组策略找出两个缺失数字。示例代码基于 C++ 编写,强调线性时间复杂度与常数空间开销。

修罗发布于 2026/3/28更新于 2026/6/521 浏览
算法实战:位运算解法详解(两数之和、唯一数字、缺失数字)

算法实战:位运算解法详解

35. 两个整数之和

题目描述

不使用运算符 + 和 -,计算两整数 a、b 之和。

解题思路

位运算的核心在于模拟加法器的逻辑。异或 ^ 运算本质上是无进位加法,而按位与 & 操作能得到需要进位的位置。由于进位需要向左移动一位才能加到正确位置,因此我们需要循环处理,直到进位变为 0。

C++ 实现

class Solution {
public:
    int getSum(int a, int b) {
        // 当进位不为 0 时继续循环
        while (b != 0) {
            int x = a ^ b;          // 无进位相加
            int y = (a & b) << 1;   // 计算进位并左移
            a = x;
            b = y;
        }
        return a;
    }
};

流程解析

文章配图


36. 只出现一次的数字 II

题目描述

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

解题思路

统计所有数字在每一个二进制位上的总和。因为其他数字都出现了三次,所以除目标数字外,每一位的累加和都能被 3 整除。对每一位的累加和取模 3,即可还原出目标数字的二进制表示。

C++ 实现

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        // 遍历 32 位整数的每一位
        for (int i = 0; i < 32; i++) {
            int sum = 0;
            // 统计当前位上所有数字的和
            for (int x : nums) {
                sum += ((x >> i) & 1);
            }
            // 余数即为该位的值
            ret |= ((sum % 3) << i);
        }
        return ret;
    }
};

流程解析

文章配图


38. 消失的两个数字

题目描述

给定包含 0..n 中 n 个数的数组 nums,其中有两个数字消失了,找出这两个消失的数字。

解题思路

这道题可以看作是'丢失的数字'与'只出现一次的数字 III'的结合。首先将数组中的所有数与区间 [1, n+2] 的所有数进行异或,问题转化为寻找两个只出现一次的数。利用异或结果中某一位为 1 的特性,将原数组和区间数分为两组分别异或,即可分离出这两个数。

C++ 实现

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int ret = 0;
        int a = 0, 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++;
        
        // 第三步:根据该位是否为 1 分组异或
        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. 算法实战:位运算解法详解
  2. 35. 两个整数之和
  3. 题目描述
  4. 解题思路
  5. C++ 实现
  6. 流程解析
  7. 36. 只出现一次的数字 II
  8. 题目描述
  9. 解题思路
  10. C++ 实现
  11. 流程解析
  12. 38. 消失的两个数字
  13. 题目描述
  14. 解题思路
  15. C++ 实现
  16. 流程解析
  17. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 基于指数预定义时间控制的固定翼无人机时空轨迹跟踪控制研究
  • 模拟算法实战:铺地毯、回文日期与扫雷解析
  • C++ 继承入门:从概念定义到默认成员函数
  • 使用 BFS 实现拓扑排序
  • C++ 核心语法解析:引用、内联函数与空指针
  • CentOS 系统定时执行 Python 邮件发送的五种方案
  • Python 3.12.0 Windows 环境安装与配置指南
  • n8n 配置飞书 Webhook 签名及 Crypto 节点用法
  • Docker 基础概念与常用命令实战
  • Python 实战:2025 年中秋月相计算与月球可视化
  • HarmonyOS 6 相机 C++ API 核心能力详解
  • S2B2C 模式下 AI 智能名片的人脉网络构建与商业价值
  • C++ STL 常用容器与数据结构实战指南
  • Ubuntu 系统下 Python 连接 KingbaseES 数据库实现增删改查
  • 前缀和算法实战:和为 K 与整除 K 的子数组问题
  • LeetCode 234 回文链表:三种解法对比与实现
  • AI 辅助开发实战:在线考试系统全流程代码解析
  • 基于 Docker 和 Ollama 本地部署 DeepSeek 大模型
  • AI Agent 开发入门:零基础学习指南
  • Ribbon 在 Zuul 1.x 网关中的负载均衡应用

相关免费在线工具

  • 加密/解密文本

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