之前没有看过位运算,真的是一脸蒙蔽,后来稍微看了下 学到了点东西 分享下
左移还是右移,当某位从一端移出时,另一端出现的空白将以从外面移入的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);
}