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

算法实战:位运算解决两数之和与唯一数字问题

位运算技巧在算法题中应用广泛。通过两道经典题目解析核心思路:利用异或和按位与模拟加法实现无符号整数求和,避免使用 + 运算符;针对数组中除一个元素外其余均出现三次的情况,统计每一位二进制位的总和并对 3 取模,还原目标数字。代码采用 C++ 实现,注重逻辑清晰与效率优化。

橘子海发布于 2026/3/20更新于 2026/7/2133 浏览
算法实战:位运算解决两数之和与唯一数字问题

前言

位运算在处理底层数据时往往能带来意想不到的效率提升。本文将通过两道经典算法题,深入探讨如何利用位运算特性解决常规算术无法直接处理的问题。

371. 两整数之和

题目描述: 不使用运算符 + 和 -,计算两整数 a、b 之和。

算法思路: 这道题的核心在于理解计算机底层的加法逻辑。加法可以拆解为两个部分:无进位相加和进位。

  • 异或(^):相当于无进位加法。例如 1 ^ 1 = 0,1 ^ 0 = 1。
  • 按位与(&)并左移(<<):相当于计算进位。只有当两个位都为 1 时才产生进位,且进位需要加到下一位。

我们需要不断重复这两个步骤,直到进位变为 0,此时剩下的结果即为最终的和。

C++ 实现:

class Solution {
public:
    int getSum(int a, int b) {
        while (b) {
            int x = a ^ b; // 先算出无进位相加的结果
            unsigned int carry = (unsigned int)(a & b) << 1; // 再算出进位
            a = x;
            b = carry;
        }
        return a;
    }
};

注意: 在计算进位时,需要将 a & b 的结果强制转换为 unsigned int,防止有符号整数左移导致未定义行为。

137. 只出现一次的数字 II

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

算法思路: 既然其他数字都出现了三次,那么对于二进制表示的每一位来说,所有数字在该位上的 1 出现的总次数应该是 3 的倍数。如果目标数字在该位上是 1,那么该位的总和模 3 余 1;如果是 0,则模 3 余 0。

因此,我们可以遍历整数的 32 个比特位,统计数组中所有数字在该位上 1 的个数,然后对 3 取模。如果余数为 1,说明目标数字在这一位上是 1,将其累加到结果中。

C++ 实现:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for (int i = 0; i < 32; i++) { // 依次检查每一位
            int sum = 0;
            for (auto x : nums) {
                if ((x >> i) & 1) sum++; // 统计第 i 位为 1 的次数
            }
            sum %= 3;
            if (sum == 1) ret |= (1 << i); // 还原目标数字的该位
        }
        return ret;
    }
};

这种解法的时间复杂度是 O(32 * N),空间复杂度是 O(1),非常高效。它不依赖哈希表,也不依赖排序,纯粹利用位运算的特性完成了任务。

目录

  1. 前言
  2. 371. 两整数之和
  3. 137. 只出现一次的数字 II
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • GitHub Copilot 配置避坑指南与安全策略
  • LeetCode Hot 100 哈希表经典题目解析
  • Visual C++ 运行库检测工具原型开发 (Python+PyQt)
  • AI 零基础入门指南:从概念到实践
  • OpenClaw 生态 16 款 AI Agent 选型指南
  • 智能家居界面美化指南:Home Assistant 主题配置与布局优化
  • 学生成绩综合统计分析系统的设计与实现
  • 使用 Nginx 部署前端 Vue 项目指南
  • Flow取代LiveData的必要性分析
  • IDA Pro MCP:用 AI 驱动逆向分析实战
  • MySQL 基本查询实战:增删改查与聚合分组详解
  • 人工智能 Gemini 2.5 Pro:技术突破与实战应用
  • 算法:前缀和原理
  • Python 核心概念与面试高频考点汇总
  • 智能在线考试系统设计与实现:AI 辅助开发实践
  • 前端预览 DOC 文件的两种方案及注意事项
  • 通义万相 2.1 应用拓展与平台调优实践
  • GitHub 学生认证申请流程与常见问题
  • FastAPI+Python 前后端交互实战:用户登录注册与信息管理
  • AI 赋能原则 10 解读:政府 2.0 与公共智能系统建设

相关免费在线工具

  • 加密/解密文本

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