程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作的运算
位运算符:
& 按位与(and)
| 按位或(or)
^ 按位异或(xor)
~ 按位取反(not)
<< 左移(shl)
>> 带符号右移(shr)
&
与运算
“&”是双目运算符,二进制对应位,同为1则为1,否则为0
例如(二进制数1010和0110)
1010&0110=0010
|
或运算
“|”是双目运算符,二进制对应位,同为0则为0,否则为1
例如(二进制数1010和0110)
1010|0110=1110
^
异或运算
“^”是双目运算符,二进制对应位,相同则为0,不同则为1
例如(二进制数1010和0110)
1010^0110=1100
~
取反运算
“~”为单目运算符,二进制位,1变为0,0变为1
例如(二进制数1010和0110)
~1010=0101,~0110=1001
<<
左移运算
“<<”是双目运算符,a<<n
把a的二进制的各二进位全部左移n位,低位补0
例如(a=10(二进制为1010))
a<<3
得到a=80(二进制为1010000)
>>
右移运算
“>>”是双目运算符,a>>n
把a的二进制的各二进位全部右移n位,低位补0
例如(a=10(二进制为1010))
a>>2
得到a=2(二进制为10)
优先级
优先等级 | 运算符 |
---|---|
1 | ~ |
2 | <<、>> |
3 | & |
4 | ^ |
5 | | |
6 | &=、^=、|=、<<=、>>= |
运用:
一、n乘以2:n<<1
二、n除以2:n>>1
三、n乘以2的m次方:n<<m
四、n除以2的m次方:n>>m
五、判断n的奇偶:n&1
奇为1,偶为0
六、交换n,m的值:n^=m; m^=n; n^=m;
七、n的绝对值:(n^(n>>31))-(n>>31);
八、n,m的最大值:n^((n^m)&-(n<m));
九、n,m的最小值:m^((n^m)&-(n<m));
十、n,m符号是否相同:(n^m)>=0;
同为1,不同为0
十一、n是否为2的幂:n&(n-1);
是为0,不是为非0
十二、n对m取余(m必须为2的幂):n&(m-1);
十三、n,m的平均值:((n^m)>>1)+(n&m);
十四、n+1:-~n;
,n-1:~-n;
十五、n的相反数:~n+1;