1. >>
>>
右移运算,表示对整数对应的二进制数右移,右移一位,即表示除以2
a >> n 即
a
/
2
n
a/2^n
a/2n
2. <<
<<
左移运算,表示对整数对应的二进制数左移,左移一位,即表示乘以2
a << n 即
a
⋅
2
n
a \cdot 2^n
a⋅2n
3. &
&
是与(and)运算,即将两个二进制的数逐位相与。
- 判断奇偶
int a;
if(a&1 == 0) 则 a 为偶数
if(a&1 == 1) 则 a 为奇数
- 取一个整数二进制数中某些位
int a = 46(00101110);
a & 0b00001111 = 00001110 //即取a的后4位,0b开头表示二进制数
- 求一个整数二进制数中1的个数
int count(int num)
{
int c = 0;
while(num)
{
num &= (num-1);
c++;
}
return c;
}
- 判断整数是否是2的幂次方
bool isPower(int n)
{
return (n > 0) && ((n & (n-1))==0);
}
4. |
|
是或(or)运算,即将两个二进制的数逐位相或。
- 将一个数变成其最接近的偶数
int a;
if(a为奇数) 则 (a|1) - 1 = a - 1 // 位运算优先级低于四则运算故加( )
if(a为偶数) 则 (a|1) - 1 = a
5. ^
^
是异或(or)运算,如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
0b11001001 ^ 0b10101010 = 0b01100011
- 取出出现奇次的数 (Leetcode 136)
int a, b, c, d;
a ^ b ^ c ^ a ^ c = b
c ^ b ^ d ^ a ^ c ^ a ^ d ^ b = 0
^
运算的逆运算是其本身
如果 a ^ b = c, 则 c ^ b = a
6. ~
~
是按位取反运算,如果a是有符号整型,则
~a = -(a+1)
如果a是无符号整型,则
~a = u_max - a //u_max表示该无符号整型类型所能表示最大数
小结
通常认为能够被位运算取代的运算,速度慢于位运算,因为位运算更接近于底层的实现!