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

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

[复制链接]
y369369 发布时间:2021-4-13 14:33

. s1 R+ Z9 ]5 w, E
    有如下十进制的加法运算:
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. // 递归写法  
    $ E" X  a, d- n& s
  2. int add(int num1, int num2){! O! K7 G$ n9 _9 a6 w* J& D
  3. if(num2 == 0) 2 D$ m" J# X9 B% d. v5 ~: B) l
  4. return num1;
    ; k; ~2 g2 c+ T
  5. int sum = num1 ^ num2;
    $ v7 R( H. D$ w9 y9 j/ ?) s5 u
  6. int carry = (num1 & num2) << 1;
    0 j; l& h, w9 K- y  v3 V
  7. return add(sum, carry);
    5 \0 T' g( a4 @# S# V& ^
  8. }
    0 ?* K$ c& j, r0 G

  9. , T2 o7 [9 a; M( f
  10. // 迭代写法  
    " b$ c4 \/ G8 ^4 a' R
  11. int add(int num1, int num2){
    1 _) i5 g2 Z- E* W
  12. int sum = num1 ^ num2;
    $ m" z" w& Y9 h4 \" |5 R0 W9 K
  13. int carry = (num1 & num2) << 1;   
    1 T: x; G0 G& @) ~$ }
  14. while(carry != 0){
    3 p, o. i- T0 b& ]1 v7 s
  15. int a = sum;
    5 v; q" ~# X/ F3 _) R
  16. int b = carry;  
    % P! x5 X: I- K
  17.         sum = a ^ b;
    & N2 @( n* Q: k1 @' A' M/ N& g
  18.         carry = (a & b) << 1;  - C( \% t2 q; `- _* {1 J6 ^# q) A
  19.     }
    6 }6 o( d: z6 A7 [* s
  20. return sum;
    # I" |& B. e2 X' d) y6 j$ S
  21. }
复制代码
5 V2 f3 [  M  T) ^" \. `
文章出处: STM32嵌入式开发
1 X% Y  D: c! f+ ~' m9 \* D
收藏 评论0 发布时间:2021-4-13 14:33

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版