位运算及位运算符
位运算概念:按二进制位进行的运算。
位运算符:
& | 按位与 |
---|---|
l | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
注:除~外,其他均为二元运算符,要求有两个操作数。
按位与(&)运算
运算符两边都为1,则结果为1,否则为0;
例: 0&0=0; 0&1=0; 1&0=0; 1&1=0;
用途: 一、清零。
例:将二进制数11100101的第二位清零。则可以与11111011做按位与运算。
二、取一个数中某些指定位。
例:对二进制数11100101取后四位。则可以与00001111做按位与运算(取哪些位,
可以让哪些位与1做按位与运算)。
按位或(|)运算
运算符两边有一个为1,则结果为1.
例: 0|0=0; 0|1=1; 1|0=1; 1|1=1;
异或(^)运算符(XOR运算符)
两边相同为0,两边相异为1;
例: 0^0=0;
0^1=0;
用途: 一、使特定位翻转。
如:二进制数01111010使第四位反转。则可与00010000进行异或运算(即与0异或不会发生改变,与1异或会发生翻转)。
二、交换2个值,不用临时变量。
例:a=3,b=4,交换a,b的值。 则可使 a=a异或b;b=b异或a;a=a异或b。
取反运算符(~)
一元运算符,1个操作数。0变成1,1变成0;
例:求~025。 先变成二进制为00010101,取反结果为11101010。
左移运算符(<<)
将一个数的各二进制位全部左移若干位。
如:a=15,a<<2。即:将a的二进制数左移两位,右边补0。 a=15=00001111,左移后得到00111100(若高位上的一左移后溢出则舍弃)
注:左移一位相当于乘以二,但前提是溢出的高位中不包含1。
右移运算符(>>)
将一个数的各二进制位全部右移若干位。
如:a=16,a>>2。即:将a的二进制数右移两位。 a=16=00010000,右移后得到00000100。 右移一位相当于除以2。
位运算算法技巧
(1)求一个二进制中1的个数。
思路:可以让这个二进制数与这个二进制数减一做按位与运算,可求出这个二进制数中位数为1的个数。
例:
public int one(){
int s=00101001,x=0;
while(s!=0){
s=s&(s-1);
x++
}
return x;
}
用到此方法的算法题: https://leetcode-cn.com/problems/number-of-1-bits/
力扣第191题,位1的个数; 以及https://leetcode-cn.com/problems/hamming-distance/力扣第461题,汉明距离。