位运算

实战位运算要点:

  • 判断奇偶
    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;
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容