你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

位运算简单总结

2021/11/10 19:32:13

文章目录

  • 位运算
    • 左右移
      • 右移
      • 左移
    • 异或
    • 与运算
      • 运算规则:
    • 或运算
      • 运算规则:
    • 按位非(按位取反)~
      • 运算规则:

/*
*@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是取反的数
}