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语言
    +关注

    关注

    180

    文章

    7596

    浏览量

    135997
  • 位运算
    +关注

    关注

    0

    文章

    16

    浏览量

    8410

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

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

收藏 人收藏

    评论

    相关推荐

    FPGA中浮点四则运算实现过程

    (减)法运算 基于FPGA 实现的浮点加法运算包括了一系列对尾数和指数部分的操作:移位、交换、格式化、舍入和格式化等。如下图所示,自定义浮点
    的头像 发表于 11-16 11:19 63次阅读
    FPGA中浮点四则<b class='flag-5'>运算</b>的<b class='flag-5'>实现</b>过程

    C语言指针运算详解

    C语言中,当你有一个指向数组中某个元素的指针时,你可以对该指针执行某些算术运算,例如加法或减法。这些运算可以用来遍历数组中的元素,如ptr
    的头像 发表于 10-30 11:16 138次阅读

    技术干货驿站 ▏解锁C语言高效编程秘诀:深入解析运算符与优先级

    C语言的学习过程中,运算符的使用是不可忽视的重要环节。本文将继续深入探讨C语言中的运算符,重点
    的头像 发表于 10-13 08:09 175次阅读
    技术干货驿站 ▏解锁<b class='flag-5'>C</b><b class='flag-5'>语言</b>高效编程秘诀:深入解析<b class='flag-5'>运算</b>符与优先级

    技术干货驿站 ▏深入理解C语言:编程高手必备,全方位解析运算符的核心技能!

    C语言的编程领域中,运算符是实现数据处理与逻辑操作的关键工具。无论是在处理简单的数值计算,还是在构建复杂的逻辑结构时,
    的头像 发表于 09-18 15:56 300次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:编程高手必备,全方位解析<b class='flag-5'>运算</b>符的核心技能!

    c语言从右到左的运算符有哪些

    以下是一些主要的从右到左运算C语言运算符: 函数调用运算符 ( () ):当您调用一个函数时,参数列表是从右到左进行求值的。 后置递增
    的头像 发表于 08-20 11:39 647次阅读

    串行加法器和并行加法器的区别?

    串行加法器和并行加法器是两种基本的数字电路设计,用于执行二进制数的加法运算。它们在设计哲学、性能特点以及应用场景上有着明显的区别。
    的头像 发表于 05-23 15:06 2088次阅读

    加法器的原理是什么 加法器有什么作用

    加法器是数字电路中的基本组件之一,用于执行数值的加法运算加法器的基本原理和作用可以从以下几个方面进行详细阐述。
    的头像 发表于 05-23 15:01 2341次阅读
    <b class='flag-5'>加法</b>器的原理是什么 <b class='flag-5'>加法</b>器有什么作用

    verilog语音实现浮点运算

    Verilog可以通过使用IEEE标准的浮点数表示来实现浮点运算。下面是一个基本的Verilog模块示例,展示了如何进行加法、乘法和除法等常见的浮点运算
    发表于 03-25 21:49

    C语言变量应用详解

    变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
    发表于 03-18 11:18 339次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>变量应用<b class='flag-5'>详解</b>

    加法运算电路和减法运算电路的区别

    加法运算的电路如下图所示,输出电压为若干个输入电压的比例和
    的头像 发表于 02-19 09:52 6583次阅读
    <b class='flag-5'>加法</b><b class='flag-5'>运算</b>电路和减法<b class='flag-5'>运算</b>电路的区别

    什么是反相加法运算电路?反相加法运算电路与减法运算电路

    在电子技术的海洋中,有一种电路如同数学中的加法器一样,能够将不同的信号进行相加处理。这就是被广泛应用于信号处理领域的反相加法运算电路。
    的头像 发表于 02-17 15:34 4139次阅读
    什么是反相<b class='flag-5'>加法</b><b class='flag-5'>运算</b>电路?反相<b class='flag-5'>加法</b><b class='flag-5'>运算</b>电路与减法<b class='flag-5'>运算</b>电路

    STM32开发中的运算以及操作

    STM32开发中的运算以及操作  运算是计算机中常用的一种
    的头像 发表于 02-02 14:38 1460次阅读

    反相加法运算电路原理介绍

    反相加法运算电路利用运算放大器(通常简称为Op-Amp)的特性来实现多个输入信号的加法运算。每个
    的头像 发表于 01-31 15:53 3192次阅读
    反相<b class='flag-5'>加法</b><b class='flag-5'>运算</b>电路原理介绍

    C语言构建高效的嵌入式程序

    嵌入式工程师在编写C语言程序时,需要注重效率和清晰的思路。本文将通过解析经典问题“猴子选大王”来展示如何用C语言思维方式构建高效、清晰的程序
    的头像 发表于 12-21 09:27 589次阅读

    单片机C语言操作的编程实现:置和清零

    前面介绍了C语言编程的6种操作,分别是按与“&”、按“或|”、按
    的头像 发表于 11-28 09:35 5942次阅读
    单片机<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>位</b><b class='flag-5'>操作</b>的编程<b class='flag-5'>实现</b>:置<b class='flag-5'>位</b>和清零