Java位操作

1、判断奇数偶数

if(n & 1 == 1){
    // n 是个奇数。
}

2、交换两个数

x = x ^ y  
y = x ^ y   
x = x ^ y  

代替


int tmp = x;
x = y;
y = tmp;

3、找出唯一没有重复的数

数字 1、2、2、1、3、3、4、5、4中找出只出现过1次的数

一道LeetCode题解,从数组中找出出现过1次的数,已知这样的数有2个。

首先先获得者两个数相异或的结果,再找出最低位对应的数值mask,再通过&操作,将数组中的数分成两组,同组数之间再进行异或,得出结果。

public static int[] singleNumbers(int[] nums) {
        // 4 1 4 6
        int[] rst = new int[2];
        int len = nums.length;
        if (len == 2) {
            return nums;
        }
        // 获取出现过1次的两个数相与后的中间值mid = a1 ^ a2
        int mid = 0;
        for (int num : nums) {
            mid = mid ^ num;
        }
        // 获取mid中最低位1对应的数值mask
        int mask = mid & (mid * (-1));
        for (int num : nums) {
            if ((num & mask) == 0) {
                rst[0] ^= num;
            } else {
                rst[1] ^= num;
            }
        }
        return rst;
    }

4、位运算代替乘除法

//a = a / 2
a<<=1;
//a = a * 2
a>>=1;

参考文档

[1]: 【算法技巧】位运算装逼指南
[2]: 有助于改善性能的Java代码技巧
[3]: 实用 | 35个可以提高千倍效率的Java代码小技巧

posted @ 2019-05-31 01:14  清泉白石  阅读(375)  评论(0编辑  收藏  举报