C++的位运算之逻辑位运算符

位运算是直接操作二进制的运算,是C++中速度最快的运算之一。

1、按位与 &:两个位都为1时,结果才为1,否则为0。有0则0,全1才1。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=5;//二进制:0101
	int b=3;//二进制:0011
	int c=a&b;//计算: 0101 & 0011=0001
	cout<<c<<endl;//输出:1 
	return 0;
} 

常见用途:

判断是否是2的幂:n&(n-1)==0,为2的幂。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	if(n>0&&(n&(n-1))==0){
		cout<<"true";
	}
	else{
		cout<<"false";
	}
	return 0;
}

判断是否是4的幂:首先要大于0,要是2的幂,最后要对3取余为1

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	if(n>0&&(n&(n-1))==0&&n%3==1){ //首先要大于0,要是2的幂,最后要对3取余为1
		cout<<"yes";
	}
	else{
		cout<<"no";
	}
	return 0;
}

判断是否是偶数:偶数的二进制最后一位一定是0。(n&1)==0,为偶数。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	if((n&1)==0){  //要加小括号,按位与运算符 & 的优先级,比等于运算符==低
		cout<<"yes";
	}
	else{
		cout<<"no";
	}
	return 0;
}

2、按位或 |:两个位只要有一个为1,结果就为1。有1则1,全0才0.

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=5;//二进制:0101
	int b=3;//二进制:0011
	int c=a|b;//计算:0101 & 0011=0111
	cout<<c<<endl;//输出:7
	return 0;
} 

常见用途:

给某个位设为1,第三位设为1。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int x=4;//二进制为100
	x=x|1;//100|001=101
	cout<<x;//输出5
	return 0;
}

3、按位异或 ^ :两个位不同时结果为1,相同时为0。相同为0,不同为1。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=5;//二进制:0101
	int b=3;//二进制:0011
	int c=a^b;//计算:0101 ^ 0011=0110
	cout<<c<<endl;//输出:6
	return 0;
} 

四个性质:

任何数异或自身=0:x^x=0

任何数异或0=自身:x^0=x

交换律:ab=ba

结合律:(ab)c=a(bc)

常见用途:

交换两个变量的值(不用临时变量)。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=2,b=9;//二进制:0010 1001
	a=a^b;//现在a变成1011
	b=a^b;//现在b变成0010
	a=a^b;//现在a变成1001,交换完成
	cout<<a<<" "<<b;//输出9 2
	return 0;
}

4、按位取反 ~:把每一位都取反,0变1,1变0。

C++中int是有符号的整数,内存以补码存储,按位取反是对补码每一位翻转

正数的原码、反码、补码完全相同

负数:原码:最高位为符号位(1表示负,0表示正)

​ 反码:符号不变,其余位取反

​ 补码:反码+1

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=5;//二进制:00000101,正数的原码、反码、补码完全相同
	int c=~a;//原补码,取反后得到:11111010,仍是补码的形式,转成反码:补码-1,11111001,再转成原码:符号位不变其他位取反 10000110
	cout<<c;//二进制10000110为-6
	return 0;
}

更多推荐