你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

通过C语言的位运算实现加法操作

[复制链接]
y369369 发布时间:2021-4-13 14:33
! \% L- G: P0 g
    有如下十进制的加法运算:
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 1101
0000 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即为最终的结果。
通过位运算实现加法
按照上面的分析,写出通过位运算实现加法的如下代码:
  1. // 递归写法  
    3 V6 D% T% c7 _( v
  2. int add(int num1, int num2){
    8 a! a* s; U0 y/ A3 Z' w1 ]& W3 s5 d
  3. if(num2 == 0) ' K: m6 n9 Q0 u5 K0 r! i9 g
  4. return num1;
    ) O* |2 N$ `2 f% m$ d7 @: w6 L) p
  5. int sum = num1 ^ num2;
    ' L% v% I# f+ G6 h% @
  6. int carry = (num1 & num2) << 1;( `. x' v  h) j5 U( r
  7. return add(sum, carry);& T6 ], a* F1 j! ]( v5 D! N9 G  Z; ?
  8. } & t  A/ K8 x+ N. Z# R: ], n
  9. . H$ M7 k  ^# G+ J
  10. // 迭代写法  & ]& {) W* I( `( q4 t( ?
  11. int add(int num1, int num2){
    2 `8 _5 J/ x4 ~
  12. int sum = num1 ^ num2; 2 b. _9 A' s7 k, x9 g
  13. int carry = (num1 & num2) << 1;   
    % p( G: ?' \" V7 V+ d% _/ I
  14. while(carry != 0){ ! G8 z- f, {& i9 s: a9 M1 W& Y
  15. int a = sum;
    , j3 S8 n& Q  f3 i, q4 F
  16. int b = carry;  
    4 P( [7 ]( Z$ [7 y
  17.         sum = a ^ b;
    7 N/ C. [# t2 P. E
  18.         carry = (a & b) << 1;  : r# w9 Y' ^0 n' a8 F5 F& x0 O
  19.     }
    3 B( Y" R- k! i& w/ x% U
  20. return sum;
    1 D# h) Q2 O, f( L4 M
  21. }
复制代码

4 g7 }( M+ g3 M5 |% ]
文章出处: STM32嵌入式开发

+ E' ]% V+ O. t3 ?
收藏 评论0 发布时间:2021-4-13 14:33

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版