位运算
目录
- 运算符大全
- 常用技巧
一、运算符大全
注:以下操作数是整数型或者字符型
-
符号 名称 定义 记忆规律 << 按位左移 操作数每向左移一位,符号位后的最高位都将被移出,右端补零。(可能会溢出) 左移a位,操作数变成原来的2^a倍 >> 按位右移 操作数每向右移一位,最右端的移位都将被移出,左端补零。 右移b位,操作数变成原来的1/2^b倍 ~ 按位取反 将操作数的二进制按位取反。 0变1,1变0 & 按位与 两个操作数均为1时结果为1,其余情况结果为0 全1为1,其余为0 | 按位或 两个操作数有一个为1结果为1,其余情况结果为0 有1为1,其余为0 ^ 按位异或 两个操作数有一个为1,另一个为0时结果为1,其余情况为0 不同为1,相同为0
二、常用技巧
1、判断奇偶性:奇数:n & 1 == 1;偶数n & 1 == 0
bool isOdd(int n){
if((n & 1) == 1){ //只判断二进制数最后两位即可
return true; //奇数
}
else {
return false; //偶数
}
}
2、a^b^b 等于 a
找出只出现一次的数时有用
3、判断是否是2的幂 :2的幂:n & (n-1) == 0
boolean isFactorialofTwo(int n){
return n > 0 ? (n & (n - 1)) == 0 : false;
// 2的幂有1,2,4,8,16... 对应二进制1,10,100,1000,10000...
}
4、消去X对应二进制数中最右端的1
int a=0b11010100; //0b表示二进制数
stack<int> xx;
a&=a-1; //a=a & (a-1)
while (a){
xx.push(a%2);
a/=2;
}
while (!xx.empty()){
cout<<xx.top();
xx.pop();
}
//结果:11010000