记录一些算法题中常用的位运算
n&1
与运算,两个位都为1时,结果才为1,n&1 判断二进制n最右一位是否为1 可用于判断奇偶数
if((n&1)==1){
//最后一位为1
//n为奇数
}
if((n&1)==0){
//最后一位为0
//n为偶数
}
n>>1 与 n<<1
n>>1
右移操作=》各二进制位全部右移一位 丢弃二进制n最右一位,高位补0 相当于n/2
n<<1
左移操作=》各二进制位全部左移一位 丢弃二进制n最左一位 相当于n*2
int n = 2;
n >> 1; ---> 1
n << 1; ---> 4
a^b
异或运算:相同为0 相异为1
可用于翻转指定位与交换两个数
- 翻转指定位(任何数与 0 异或都会保持不变
X=1010 1110 //翻转后四位
Y=0000 1111 //令Y的低4位为1,其余位为0
X^Y=1010 0001 //为翻转后的结果
- 不需要借助临时变量 交换两个数
a = a ^ b;
b = a ^ b; // b=(a^b)^b=a^(b^b)=a
a = a ^ b; // a=(a^b)^a=a^a^b=b
应用
-
- 二进制间距
题目:
思路:遍历n二进制的每一位,记录上一位,找最大距离
代码:
class Solution {
public:
int binaryGap(int n) {
int last = -1,res=0,cur=0;
while(n!=0){
if((n&1)==1){
if(last!=-1)
res = max(res,cur-last);
last = cur;
}
n>>=1;
cur++;
}
return res;
}
};