当前位置: 首页 > article >正文

位运算 实现加法 详解

使用位运算实现加法详解

在计算机底层,位运算是一种高效的操作方式。使用位运算实现加法主要依赖以下两个关键操作:

  1. 位的异或运算 (^):用于计算没有进位的和。
  2. 位的与运算 (&) 并左移一位:用于计算进位。

1. 加法的本质

在十进制加法中,两个数字的加法可以分为两个步骤:

  1. 不考虑进位的加法:直接将对应位相加。
  2. 计算进位:如果两位都为 1,则在更高位产生进位。

例如:5 + 7 = 12

  • 二进制表示:0101(5) + 0111(7)
  • 无进位加法:0101 XOR 0111 = 0010(2)
  • 进位:0101 AND 0111 = 0101,然后左移一位为 1010(10)。
  • 将无进位结果与进位结果相加:0010 + 1010 = 1100(12)。

2. 位运算实现加法

加法的实现步骤如下:

  1. 用异或运算 (^) 计算两个数字的无进位和。
  2. 用与运算 (&) 计算进位,并左移一位。
  3. 重复以上两步,直到进位为 0。
公式化表达

设两个数为 ab,加法过程为:

  • 无进位和sum = a ^ b
  • 进位carry = (a & b) << 1
  • 重复操作a = sum, b = carry,直到 b == 0

3. 示例代码

递归实现
public class BitwiseAddition {
    public static int add(int a, int b) {
        if (b == 0) {
            return a; // 如果进位为 0,则返回最终结果
        }
        int sum = a ^ b; // 无进位和
        int carry = (a & b) << 1; // 进位
        return add(sum, carry); // 递归计算
    }

    public static void main(String[] args) {
        System.out.println(add(5, 7)); // 输出 12
    }
}
迭代实现
public class BitwiseAddition {
    public static int add(int a, int b) {
        while (b != 0) {
            int sum = a ^ b; // 无进位和
            int carry = (a & b) << 1; // 进位
            a = sum; // 更新无进位和
            b = carry; // 更新进位
        }
        return a; // 返回最终结果
    }

    public static void main(String[] args) {
        System.out.println(add(5, 7)); // 输出 12
    }
}

4. 代码执行过程分析

示例:a = 5, b = 7
  • 二进制表示
    • a = 0101(5)
    • b = 0111(7)
步骤操作结果
初始值a = 0101, b = 0111两数待相加
第一步sum = a ^ b0101 XOR 0111 = 0010(无进位和)
carry = (a & b) << 1(0101 AND 0111) << 1 = 1010(进位)
更新值a = sum, b = carrya = 0010, b = 1010
第二步sum = a ^ b0010 XOR 1010 = 1000(无进位和)
carry = (a & b) << 1(0010 AND 1010) << 1 = 0100(进位)
更新值a = sum, b = carrya = 1000, b = 0100
第三步sum = a ^ b1000 XOR 0100 = 1100(无进位和)
carry = (a & b) << 1(1000 AND 0100) << 1 = 0000(进位)
终止条件b == 0最终结果:a = 1100(12)

5. 特殊情况处理

负数处理
  • 负数在计算机中以 补码 表示。
  • 使用位运算时,依然遵循补码规则,代码无需额外处理负数。
示例:
System.out.println(add(-3, 5)); // 输出 2
System.out.println(add(-7, -5)); // 输出 -12
大整数处理
  • 若使用 int 类型导致溢出,可以改用 long 类型,或在大数计算场景下使用 BigInteger 类。

6. 位运算加法的优缺点

优点
  1. 底层高效:位运算是直接操作二进制位,计算速度快。
  2. 硬件层面:加法器的设计原理与位运算加法类似,便于理解硬件实现。
缺点
  1. 代码复杂度较高:对比直接使用 + 运算符,位运算加法实现起来较复杂。
  2. 可读性较差:位运算需要深入了解二进制操作,新手可能不易理解。

7. 拓展:减法、乘法和除法

7.1 减法

减法可以通过加法实现,公式为:
a − b = a + ( − b ) a - b = a + (-b) ab=a+(b)

  • 负数 -b 可以通过按位取反并加 1 得到(补码规则)。
7.2 乘法

乘法可以通过位移和加法模拟:
a × b = a × ( b 0 + b 1 × 2 1 + b 2 × 2 2 + … ) a \times b = a \times (b_0 + b_1 \times 2^1 + b_2 \times 2^2 + \ldots) a×b=a×(b0+b1×21+b2×22+)

7.3 除法

除法可以通过位移和减法模拟,思路类似于笔算除法。


8. 总结

  • 位运算加法的核心思想是将 无进位和进位 分别计算,然后迭代处理进位,直到进位为 0。
  • 使用场景:
    • 理解计算机底层加法器设计。
    • 需要高度优化的场景(如嵌入式系统、硬件仿真)。
  • 实现简单加法时,直接使用 + 运算符更简洁,但掌握位运算加法有助于深刻理解计算机底层原理。

http://www.kler.cn/a/405990.html

相关文章:

  • Go-RPC关键指标分析与企业实践
  • 移动充储机器人“小奥”的多场景应用(上)
  • Java开发经验——开发常用工具类
  • C:mbedtls库实现https双向认证连接示例_七侠镇莫尛貝大侠20241122
  • 从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望
  • 项目虚拟机配置测试环境
  • 快速识别模型:simple_ocr,部署教程
  • 【人工智能】用Python构建强化学习环境:从零开始实现迷宫游戏
  • NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案
  • 安达发|在当下选择国产APS智能优化排程软件的优势
  • 【Anomaly Detection论文阅读记录】Resnet网络与WideResNet网络
  • 如何利用Java爬虫一键获取店铺的所有商品技术解析
  • 【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦
  • mybatis_plus自动填充字段,统一填充创建时间、更新时间创建人更新人等
  • 环形缓冲区 之 STM32 串口接收的实现
  • @WebService 详解
  • Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)
  • 学习笔记|MaxKB对接本地大模型时,选择Ollma还是vLLM?
  • js中new操作符具体都干了什么?
  • 为自动驾驶提供高分辨率卫星图像数据,实例级标注数据集OpenSatMap
  • 如何实现单片机的安全启动和安全固件更新
  • 达索系统亮相第三十一届中国汽车工程学会年会暨展览会
  • 【已完成】windows配置pytorch2.4.1深度学习环境
  • 商用密码应用安全性评估,密评整体方案,密评管理测评要求和指南,运维文档,软件项目安全设计相关文档合集(Word原件)
  • 玩转合宙Luat教程 基础篇④——程序基础(库、线程、定时器和订阅/发布)
  • c++ std::stack总结