不用‘+’号求 a+b 小白创作 错误请指出 轻喷!!!





之前没有看过位运算,真的是一脸蒙蔽,后来稍微看了下 学到了点东西 分享下

左移还是右移,当某位从一端移出时,另一端出现的空白将以从外面移入的0(某些计算机是送1)来补充。这说明,移位不同于循环,从一端移出的位并不送回到另一端去,移去的位永远丢失了,同时在另一端只能补上相应位数的0。

1:^按位异或

2:&与运算

3:   左移<<

4:   右移>>

Tip:

对于 移动 的 是这样子的 哈

假设a=0010  

a<<1=0100  a>>1=0001


对于^是这样的

假设a=0010

       b=1101

   a^b=1111

假设a=0010

       b=1101

   a&b=0000


对于这种操作 应该都会吧em 


先看几组数

1:

a=3,b=0

a,b 二进制表示 

   a: 11

   b: 00

2:假设a=0010

       b=1101

   a^b=1111


a,b 二进制表示 

   a: 11

   b: 00

和为 11 就是 答案是3这种情况 按位相加各个位和等于2的其实就是a^b,很快发现进不进位直接可以用 a&b表示 与不就是两个同为真(1)的情况 就为真(1)吗


a=3,b=2

这种情况 a^b就不好用了 这要考虑进位,所以心里大概知道怎么写了吧 

 

a+b可以分为三步来理解,比如a=3,b=2
1、a的二进制表示就是0011, b的二进制是0010,那么不考虑进位a+b的结果为0001。
2、 只考虑进位,结果就是0011+0010=0010
3、将该进位左移一位,变为00100
4、将00100再与0001进行异或,得到00101,即十进制下等于5
5、结束

#include<iostream>
using namespace std;
int aplusb(int a,int b);
int main()
{
int a,b;
cin>>a>>b;
cout<<aplusb(a,b)<<endl;



int aplusb(int a,int b)
{
   while(b!=0)  //b==0 就直接return a 了
   {
    int up=a&b;   //判断是否有进位
        a=a^b; //正常加一遍 
b=(up<<1);//只要有进位 就一直加
   }
   return a;
}

递归

#include<iostream>

using namespace std;

int aplusb(int a,int b);
int main()
{
int a,b;
cin>>a>>b;
cout<<aplusb(a,b)<<endl;



int aplusb(int a, int b) {  
    if((a&b) == 0)
        return a^b;
    return aplusb(a^b,(a&b)<<1);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值