Java位运算符小结
参考文章:Java 位运算符 &、|、^、~、<<、>>、>>>)
与运算符(&)
或运算符(|)
异或运算符(^)
取反运算符(~)
左移运算符(<<)
右移运算符(>>)
无符号右移(>>>)
扩展
取某数字的二进制最右边的1
交换两个数,无额外空间消耗
1 2 3 4 5 6 7
| public static void swapNum(int num1,int num2){ num1 ^= num2; num2 ^= num1; num1 ^= num2; System.out.println(num1); System.out.println(num2); }
|
一个数组中只有一种数出现了奇数次,其他数出现了偶数次,找出这种数
1 2 3 4 5 6 7 8
| public static void printOneNum(int[] arr){ int eor=0; for(int i=0;i<arr.length;i++){ eor ^= arr[i]; } System.out.println(eor); }
|
一个数组中有两种数出现了奇数次,其他数出现了偶数次,找出这种数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public static void printTwoNum(int[] arr){ int eor=0; for(int i=0;i<arr.length;i++){ eor ^= arr[i]; } int rightOne=eor & (~eor+1); int onlyOne=0; for (int i = 0; i < arr.length; i++) { if ((arr[i] & rightOne)!=0){ onlyOne ^= arr[i]; } } System.out.println(onlyOne); System.out.println(onlyOne^eor); }
|