文章目录
- 位运算
- 左右移
- 右移
- 左移
- 异或
- 与运算
- 运算规则:
- 或运算
- 运算规则:
- 按位非(按位取反)~
- 运算规则:
/*
*@author zhazhazhi
*qq:2055418639
*github:zhazhazhi7
*/
位运算
左右移
计算机中数的储存一般都是用补码来存储的,而补码:其中正数是和原码一样的,而负数的补码先有其原码取反,再加一得来。
左右移是位运算的常见操作
右移
右移有两种:有符号右移与无符号右移
无符号的右移,是数字二进制码的最高位是符号位,1代表为负数,0代表为正数,在进行移位操作的时候,最高位补位(负数补1,正数补0),最低位舍弃,其余的位置都向右移动n(n代表要移动的位数)位
右移可以看作将原数除了n个2得到的结果,如:8右移两位得到2,8除以两次2得到的也是2;
例:将数字8右移2位
8的原码是0000 1000 -> 8的补码是0000 1000 -> 右移两位后的补码 0000 0010 代表的数字是2;
-8的原码是1000 1000 -> -8的补码是1111 1000 -> 右移两位后的补码是1111 1110代表的数字是-2;
用C++来验证结果:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a = 8 , b = -8;
a=a>>2;
b=b>>2;
cout<<"a="<<a<<endl<<"b="<<b<<endl;
}
左移
左移是高位舍弃,低位补0,其余的位置都左移两位
左移之后,得到的结果是原数连乘多次得到的结果一样,如:将8左移两位,得到的数是32,而将8连乘两次2,得到的数是32.
用C++来验证结果:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a = 8 , b = -8;
a=a<<2;
b=b<<2;
cout<<"a="<<a<<endl<<"b="<<b<<endl;
}
异或
异或也是算法中常用的操作,异或运算时,所有相同的位值相同则为0,不同为1。如:
1与2 异或运算 1的补码为0001 2的补码为0010 异或之后得到的数为0011——3
异或的符号为”^“(不是高中数学见过的圆圈加括号)
异或可以用来在没有第三个变量的时候交换两个变量的值
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a = 3 , b = -3;
if(a!=b){
a^=b;//这里的代码用了简写,完整:a=a^b;
b^=a;//简写同上
a^=b;
}
cout<<"a="<<a<<endl<<"b="<<b<<endl;
}
与运算
运算规则:
两个操作数对应的二进制位,都为1则为1,否则为0。如:1&1=1; 1&0=0; 0&1=0; 0&0=0
或运算
运算规则:
两个操作数对应的二进制位,有1则为1,否则为0。如:1|1=1; 1|0=1; 0|1=1; 0|0=0
按位非(按位取反)~
运算规则:
两个操作数对应的二进制位,取反操作。如:1->0; 0->1
验证代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
a = 2;
b = ~(a);
cout<<a<<endl<<b<<endl; //a是原来的数,b是取反的数
}