实战位运算要点:
- 判断奇偶
x % 2 == 1 → x & 1 == 1
x % 2 == 0 → x & 0 == 0 - x >> 1 → x / 2
即:x = x / 2; → x = x >> 1 (常见于JDK源码)
mid = (left + right) / 2 → mid = (left + right) >> 1; - x = x & (x - 1) 消去最低位的1
- x & ~x → 0 消去最低位的1 等价于x = x & (x - 1)
public static void main(String[] args) {
System.out.println(12 & ~ -12); //8
System.out.println(12 & (12 - 1)); //8
}
- x & -x 得到最低位的1
实战
LeetCode191题 位1的个数 https://leetcode-cn.com/problems/number-of-1-bits/
这题用简单的循环当然可以做,但是用位运算更加的方便
就用上面所说的一条:x = x & (x - 1) 来消去最低位的1,以此来判断1的个数
public static int hammingWeight(int n) {
int sum = 0;
while (n != 0) {
sum++;
n &= (n - 1);
}
return sum;
}
当然,这样也是可以的
public static int hammingWeight(int n) {
int sum = 0;
while (n != 0) {
sum++;
n = n & ~ -n;
}
return sum;
}
LeetCode第231题 2的幂 https://leetcode-cn.com/problems/power-of-two/
如果是2的幂。那么二进制为必然只有一个1,那么消去它就变成了0。不过这里需要注意越界的问题,应该把n转为long类型。
public static boolean isPowerOfTwo(int n) {
long x = (long) n;
return n != 0 && (x & (x - 1) ) == 0;
}
LeetCode 190 颠倒二进制位
这种题你把它转成字符串在reverse再转回来的确是可以做的,但是太复杂了。使用位运算就能变的十分简单。用n&1不断取出n的最后一位,再放到ans中即可。
public static int reverseBits(int n) {
int ans = 0;
for (int i = 0; i < 32; i++) {
ans = (ans << 1) + (n & 1);
n = n >> 1;
}
return ans;
}
网友评论