c语言三位数加法进位次数计,如何用C语言的位运算实现加法操作详解

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值