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

    文章

    7642

    浏览量

    144625
  • 位运算
    +关注

    关注

    0

    文章

    17

    浏览量

    8641

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

    C语言特性

    数据,实现对设备的精准控制,同时降低功耗,延长设备的使用寿命。 2、可移植性:跨平台的通行证 C 语言具有良好的可移植性,这意味着用 C 语言
    发表于 11-24 07:01

    C语言操作

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

    C语言宏拼接运算符典型使用

    C语言中,##运算符(称为[size=16.002px]标记拼接运算符)用于宏定义中将两个标记(token)拼接成一个新的标记。它在预处理阶段处理,常用于动态生成变量名、函数名或类型
    发表于 11-20 08:27

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

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

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

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

    定点数表示实数的方法以及定点数在硬件上的运算验证

    ,Vivado就能将后续有符号数运算综合成相应电路(与C语言不同,Verilog规定,无符号数与有符号数运算,会将有符号数视为无符号数)。以下述RTL代码所示有符号Q15定点数乘法为例
    发表于 10-28 08:13

    E203V2长周期乘法器核心booth算法解读

    E203V2的数据通道中的加法运算单元可得加法器的输入没有进位,而进行减法器运算时,进位输入为1,此时完美解决了-A和-2A的问题,只需将运算
    发表于 10-24 09:33

    RVB 操作指令集扩展(一)

    一、B扩展简介 B扩展,即bit-manipulation (bitmanip) extension,主打增强操作的指令集。B扩展定义了RV32-64下的操作指令。为了更精准地在领
    发表于 10-22 08:11

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

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

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

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

    全套C语言培训资料—PPT课件

    与共用体、运算、文件 全套C语言培训资料,共427页,13个章节:C语言概述、程序的灵魂—算
    发表于 03-12 14:50

    Verilog中signed和$signed()的用法

    吗?其实不是的,因为有符号数和无符号数据的加法强结果和乘法器结构是一样的,signed的真正作用是决定如何对操作数扩的问题。 2、verilog中的加法和乘法
    的头像 发表于 02-17 17:47 1186次阅读
    Verilog中signed和$signed()的用法