0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用C语言的位运算实现加法操作详解

STM32嵌入式开发 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2021-04-13 10:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

分享本文,希望能起到抛砖引玉的作用,加深朋友对位运算以及计算机底层的认识。

有如下十进制的加法运算:

13 + 9 = 22

我们像这样来拆分这个运算过程:

不考虑进位,分别对各位数进行相加,结果为sum:

个位数3加上9为2;十位数1加上0为1;最终结果为12;

只考虑进位,结果为carry:

3 + 9 有进位,进位的值为10;

如果步骤2所得进位结果carry不为0,对步骤1所得sum,步骤2所得carry重复步骤1、 2、3;如果carry为0则结束,最终结果为步骤1所得sum:

这里即是对sum = 12 和carry = 10重复以上三个步骤,(a) 不考虑进位,分别对各位数进行相加:sum = 22; (b) 只考虑进位: 上一步没有进位,所以carry = 0;(c) 步骤2carry = 0,结束,结果为sum = 22。

把上面的运算过程放在二进制中试试。

13和9的二进制分别为:

0000 11010000 1001

①不考虑进位,分别对各位数进行相加得到sum:‍

0000 0100

②当考虑进位,有两处进位,第0位和第3位,只考虑进位的结果为carry:

0001 0010

③判断carry是否为0,为0则结束,最终计算结果为sum;如果carry不为0,则进行如下操作,并重复步骤①②③:

sum+=carry

上面步骤③中判断carry不为0,回到步骤①:

不考虑进位,sum+carry= :

0001 0110

步骤②:

只考虑进位,carry =:

0

步骤③:

判断carry为0,结束,最终sum=:

0001 0110

转换成十进制刚好是22,十进制的算法同样适用于二进制!

仔细观察发现:

第①步不考虑进位的加法其实就是异或运算

第②步只考虑进位就是按位与运算之后左移一位

第③步就是重复前面两步操作,直到第二步进位结果为0

这里为什么要循环步骤①②③,直到步骤②所得进位carry等于0呢?这是因为有的数做加法时会出现连续进位的情况。在第③步检测carry如果为0,则表示没有进位了,此时,此次循环第①步的sum即为最终的结果。

通过位运算实现加法

按照上面的分析,写出通过位运算实现加法的如下代码:

// 递归写法 int add(int num1, int num2){if(num2 == 0) return num1;int sum = num1 ^ num2;int carry = (num1 & num2) 《《 1;return add(sum, carry);}

// 迭代写法 int add(int num1, int num2){ int sum = num1 ^ num2; int carry = (num1 & num2) 《《 1; while(carry != 0){ int a = sum; int b = carry; sum = a ^ b; carry = (a & b) 《《 1; }return sum;}
编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146159
  • 位运算
    +关注

    关注

    0

    文章

    17

    浏览量

    8677

原文标题:通过C语言的位运算实现加法操作

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    高速低功耗的利器:MC10H180双2加法器/减法器

    高速低功耗的利器:MC10H180双2加法器/减法器 在电子设计领域,高速、低功耗的加法器/减法器一直是工程师们追求的目标。今天,我们就来详细了解一下ON Semiconductor
    的头像 发表于 04-11 11:05 237次阅读

    深入解析DM74LS83A 4二进制快速进位加法

    的特性、参数以及应用场景。 文件下载: DM74LS83AN.pdf 一、概述 DM74LS83A能够实现两个4二进制数的加法运算。它为每一
    的头像 发表于 04-10 16:45 671次阅读

    深入剖析 DM74LS283:4 快速进位二进制加法

    二进制加法器,它在众多数字电路设计中发挥着重要作用。 文件下载: DM74LS283N.pdf 一、产品概述 DM74LS283 主要用于实现两个 4 二进制数的加法
    的头像 发表于 04-10 16:40 242次阅读

    74F583 4BCD加法器:高速运算的理想之选

    74F583 4BCD加法器:高速运算的理想之选 在电子设计领域,加法器是实现数字运算的基础组
    的头像 发表于 04-10 16:40 142次阅读

    十进制计算机算术运算器“加法器”专利申请解析

    。针对每个逻辑值的运算,不再依赖于复杂的十值或N值逻辑门,而是通过对空间上并行的多条线路,直接利用现有的二值逻辑元件进行编码连接,从而实现十进制逻辑运算与数值编码运算
    的头像 发表于 03-25 09:41 802次阅读
    十进制计算机算术<b class='flag-5'>运算</b>器“<b class='flag-5'>加法</b>器”专利申请解析

    探索CD54/74AC283与CD54/74ACT283:高效4二进制加法器的奥秘

    探索CD54/74AC283与CD54/74ACT283:高效4二进制加法器的奥秘 在电子设计领域,加法器是实现数字运算的基础元件之一。今
    的头像 发表于 01-28 16:50 596次阅读

    C语言主要特点

    。 5.语法限制不太严格,程序设计自由度大。 6.C语言允许直接访问物理地址,能进行(bit)操作,能够实现汇编语言的大部分功能,可以直接
    发表于 01-05 07:41

    C语言中除数为0属于什么错误

    0 的错误,以及援引数组元素时下标溢出等。 静态错误又可以分为语法错误和静态语义错误。语法错误指有关语言结构上的错误,如单词拼写错误、表达式中缺少操作数、括号不匹配等。静态语义错误指语言意义上错误,如
    发表于 12-08 06:38

    为什么单片机还在用C语言编程?

    使用加法、减法、移位运算,不要过多的使用乘法除法,因为乘法和除法运算会非常耗时间,特别是除法,会耗费很多时间,这对于运算速度本身就有限制的单片机来说,是一个非常大的负担。 二、高级
    发表于 11-28 07:37

    请问如何用C语言列举当前所有网口?

    何用C语言列举当前所有网口?
    发表于 11-25 07:23

    C语言操作

    C 语言操作符包括按与( )、按或(|)、按
    发表于 11-21 07:52

    复杂的软件算法硬件IP核的实现

    ,该模块对应于 C 语言加法运算符。还有连接 ALU8 以及各个端口的 wire 部件等。 从 begin 到 end 部分,包含了整个函数实现
    发表于 10-30 07:02

    第4章 C语言基础以及流水灯的实现(4.3 4.4)

    4.3 C语言基本运算符 小学数学学过加、减、乘、除等运算符号以及四则混合运算,而这些运算符号在
    的头像 发表于 10-29 15:30 433次阅读

    e203乘法运算结构及算法原理

    乘法运算。 考虑到E203的定位以及性能、功耗与芯片面积的平衡,E203采用了一些恰到好处的资源复用设计。 首先,乘法器每周器中的加法操作是通过复用ALU中的加法
    发表于 10-22 06:43

    e203 ALU乘法运算结构及算法原理

    乘法运算。 考虑到E203的定位以及性能、功耗与芯片面积的平衡,E203采用了一些恰到好处的资源复用设计。 首先,乘法器每周器中的加法操作是通过复用ALU中的加法
    发表于 10-22 06:12