给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

知识点: 
1.位与运算(&或者and)
and运算通常用于二进制的取 位操作,例如一个数 and 1的结果就是取 二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为 偶数,最末位为1表示该数为奇数。
相同位的两个数字都为1,则为1;若有一个不为1,则为0。(不考虑进位)
00101
11100
----------------
00100
2.异或运算(^)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。在二进制运算中结果如下(不考虑进位)
00101
11100
       ----------------
       11001
3.shl运算 (<<) 
a shl b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 shl 2 = 400。可以看出,a shl b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2。
通常认为a shl 1比a * 2更快,因为前者是更底层一些的操作。因此程序中乘以2的操作请尽量用左移一位来代替。
运算思路
一.将二进制运算分解成两部分 a+b=a^b+(a&b)<<1
1.异或运算 各个权值相等的位进行相加  此部分是没有进位的部分,进位的部分用0代替
例     0110   (十进制 6)
         0010    (十进制 2)
-----------------------
         0100    (十进制 4)
2 位与运算  通过位与运算得到两数相加中哪些权位进行了进位  在二进制运算中 向下一权位进1,即为原2进制的权位×2,
    
例     0110   (十进制 6)
         0010   (十进制 2)
#include<iostream>
using namespace std;
int main()
{
     int a = 6, b = 2;
    int c = a ^ b;
    int d = a & b;
	cout<<"初始c d 的值"<<endl;
	cout<<"c="<<c<<endl;
	cout<<"d="<<d<<endl;
    while(d) //这里以进不进位作为循环的终结
    {
        int a = c;
        int b = d << 1;
	cout<<"循环中 a b 变化"<<endl;
	cout<<"a="<<a<<endl;
	cout<<"b="<<b<<endl;
        c = a ^ b;
        d = a & b;
		cout<<"c="<<c<<endl;
		cout<<"d="<<d<<endl;
    }
    printf("res = %d\n", c);
    return 0;
;
}

-----------------------
                   0010     (十进制2)
代表权值为2的位产生了进位,产生的进位的数值为0100 (用0010<<1得到)
将这两部分相加可得到第一步的结果
二.
将产生的两部分运算结果分别与输入的结果a,b进行替换,进行重复的运算操作,直到没有进位为止,得到最终结果


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值