C++的位运算之逻辑位运算符
·
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;
}
更多推荐

所有评论(0)