位运算——用法和技巧总结

322 阅读1分钟

位运算


目录

  • 运算符大全
  • 常用技巧

一、运算符大全

注:以下操作数是整数型或者字符型

  • 符号名称定义记忆规律
    <<按位左移操作数每向左移一位,符号位后的最高位都将被移出,右端补零。(可能会溢出)左移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