位运算 实现加法 详解

使用位运算实现加法详解

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

  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。
  • 使用场景:
    • 理解计算机底层加法器设计。
    • 需要高度优化的场景(如嵌入式系统、硬件仿真)。
  • 实现简单加法时,直接使用 + 运算符更简洁,但掌握位运算加法有助于深刻理解计算机底层原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android 使用MediaPlayer实现音乐播放--权限请求

在Android应用中&#xff0c;获取本地音乐文件的权限是实现音乐扫描功能的关键步骤之一。随着Android版本的不断更新&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用需要动态请求权限&#xff0c;而到了android 13以上需要的权限又做了进一步…

Docker 容器化开发 应用

Docker 常用命令 存储 - 目录挂载 存储 卷映射 自定义网络 Docker Compose语法 Dockerfile - 制作镜像 镜像分层机制 完结

Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存

excel保存数据的三种方式&#xff1a; 1、pandas保存excel数据&#xff0c;后缀名为xlsx; 举例&#xff1a; import pandas as pddic {姓名: [张三, 李四, 王五, 赵六],年龄: [18, 19, 20, 21],住址: [广州, 青岛, 南京, 重庆] } dic_file pd.DataFrame(dic) dic_file…

【Unity How】Unity中如何实现物体的匀速往返移动

直接上代码 using UnityEngine;public class CubeBouncePingPong : MonoBehaviour {[Header("移动参数")][Tooltip("移动速度")]public float moveSpeed 2f; // 控制移动的速度[Tooltip("最大移动距离")]public float maxDistance 5f; // 最大…

面向对象-接口的使用

1. 接口的概述 为什么有接口&#xff1f; 借口是一种规则&#xff0c;对于继承而言&#xff0c;部分子类之间有共同的方法&#xff0c;为了约束方法的使用&#xff0c;使用接口。 接口的应用&#xff1a; 接口不是一类事物&#xff0c;它是对行为的抽象。 2. 接口的定义和使…

理论结合实践:用Umami构建网站分析系统

个人博客地址&#xff08;欢迎大家访问&#xff09;&#xff1a;理论结合实践&#xff1a;用Umami构建网站分析系统 1. 引言 网站统计分析是一种通过收集、处理和分析网站数据来评估网站性能、用户行为和流量来源的综合方法。通过分析用户访问模式、页面浏览量、访问时长、用户…

【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦

Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像&#xff1a;通过双像素可以实现&#xff1a;深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上&#xff0c;也有遮罩等方式的pd生成&#xff0c;如图双像素视图可以看到光圈的不同一半&#x…

sysbench压测DM的高可用切换测试

一、配置集群 1. 配置svc.conf [rootlocalhost dm]# cat /etc/dm_svc.conf TIME_ZONE(480) LANGUAGE(CN)DM(192.168.112.139:5236,192.168.112.140:5236) [DM] LOGIN_MODE(1) SWITCH_TIME(300) SWITCH_INTERVAL(200)二、编译sysbench 2.1 配置环境变量 [dmdba~]# vi ~/.bas…

高性能linux服务器运维实战小结 性能调优工具

性能指标 进程指标 进程关系 父进程创子进程时&#xff0c;调fork系统调用。调用时&#xff0c;父给子获取一个进程描述符&#xff0c;并设置新的pid&#xff0c;同事复制父进程的进程描述符给子进程&#xff0c;此时不会复制父进程地址空间&#xff0c;而是父子用相同地址空…

pcb元器件选型与焊接测试时的一些个人经验

元件选型 在嘉立创生成bom表&#xff0c;对照bom表买 1、买电容时有50V或者100V是它的耐压值&#xff0c;注意耐压值 2、在买1117等降压芯片时注意它降压后的固定输出&#xff0c;有那种可调降压比如如下&#xff0c;别买错了 贴片元件焊接 我建议先薄薄的在引脚上涂上锡膏…

【zookeeper03】消息队列与微服务之zookeeper集群部署

ZooKeeper 集群部署 1.ZooKeeper 集群介绍 ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。 集群结构 Zookeeper集群基于Master/Slave的模型 处于主要地位负责处理写操作)的主机称为Leader节点&#xff0c;处于次要地位主要负责处理读操作的主机称为 follower 节点…

C 语言复习总结记录三

C 语言复习总结记录三 一 函数的定义 维基百科中对函数的定义&#xff1a;子程序 在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, function, routine, method, subprogram, callable unit&#xff09;&#xff0c;是一个大型程序中的…

MYSQL——多表设计以及数据库中三种关系模型

大致介绍数据库中三种关系模型 一对多&#xff08;1:N&#xff09; 定义&#xff1a; 一个实体可以与另一个实体的多个实例相关联&#xff0c;而后者只能与前者的一个实例相关联。 例子&#xff1a; 学生和课程的关系。 学生&#xff08;1&#xff09;&#xff1a;每个学生…

OpenCV和Qt坐标系不一致问题

“ OpenCV和QT坐标系导致绘图精度下降问题。” OpenCV和Qt常用的坐标系都是笛卡尔坐标系&#xff0c;但是细微处有些不同。 01 — OpenCV坐标系 OpenCV是图像处理库&#xff0c;是以图像像素为一个坐标位置&#xff0c;即一个像素对应一个坐标&#xff0c;所以其坐标系也叫图像…

实验四:构建园区网(OSPF 动态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、在 eNSP 中部署网络 2、设计全网 IP 地址 3、配置二层交换机 4、配置路由交换机并测试通信 5、配置路由接口地址 6、配置 OSPF 动态路由&#xff0c;实现全网互通 一、实验简介 使用路由…

《剖析 Spring 原理:深入源码的旅程(二)》

六、Spring 的 Bean 注入与装配 Spring 的 Bean 注入与装配的方式有很多种&#xff0c;可以通过 xml、get set 方式、构造函数或者注解等。简单易用的方式就是使用 Spring 的注解&#xff0c;Spring 提供了大量的注解方式&#xff0c;如 Autowired、Qualifier 等。Spring 还支持…

Java文件上传解压

目录结构 工具类 枚举 定义文件类型 public enum FileType {// 未知UNKNOWN,// 压缩文件ZIP, RAR, _7Z, TAR, GZ, TAR_GZ, BZ2, TAR_BZ2,// 位图文件BMP, PNG, JPG, JPEG,// 矢量图文件SVG,// 影音文件AVI, MP4, MP3, AAR, OGG, WAV, WAVE}为了避免文件被修改后缀&#xff0…

CSRF保护--laravel进阶篇

laravel对csrf非常重视&#xff0c;专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久&#xff0c;那么您可能对于web.php路由文件的post请求很疑惑&#xff0c;因为get请求很顺利&#xff0c;而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点&#xff1a;一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果&#xff1a;加粗&#xff0c;斜体&#x…

【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本

GRAPH ATTENTION NETWORKS 代码详解 前言0.引言1. 环境配置2. 代码的运行2.1 报错处理2.2 运行结果展示 3.总结 前言 在前文中&#xff0c;我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来&#xff0c;将开启一个新的阶段&#…