位运算 : 巧妙使用异或(^)

Posted AJiSun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算 : 巧妙使用异或(^)相关的知识,希望对你有一定的参考价值。

位运算主要针对的是二进制,包括 异或(^), 与(&),或(|),非(~)

1. 下面说下异或的规则和应用场景

规则:两个位相同为0,不同为1

例1: 6 ^ 7

 

2. 异或运算的性质
  • 任意一个变量和0异或结果都是其本身 (0^N=N)

  • 任意一个变量和其自身异或结果都是0(N^N=0)

  • 异或运算满足交换律和结合律

 

3. 巧妙使用的例子

例2: 巧妙利用异或,不用额外变量交换两个变量的值

public static void main(String[] args) {

           int a = 10;
           int b = 6;
               // a = a^b
           a = a ^ b;
               // b = a^b^b = a
           b = a ^ b;
               // a = a ^ a^b = b
           a = b ^ a;
           System.out.println("a="+a + ",b=" + b);  
  }

输出:

a=6,b=10

 

例3: 选择排序中交换两个数据的位置(剩下数据中最小的与当前位置互换)

public static void main(String[] args) {
       int[] nums = {5, 3, 8, 4, 2, 1, 9, 7, 6,500,100,300,200,400};
       for (int i=0;i<nums.length;i++){
           int n = i;
           for (int j=i;j<nums.length;j++){
               if (nums[n]>nums[j]){
                   n = j;
              }
          }
           if (i!=n){
               nums[i] = nums[i] ^ nums[n];
               nums[n] = nums[i] ^ nums[n];
               nums[i] = nums[i] ^ nums[n];
          }
      }
       System.out.println(Arrays.toString(nums));

  }

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 200, 300, 400, 500]

 

例4: 一个数组中只有一种数出现奇数次,其他都出现偶数次,怎么找到这个数

public static void main(String[] args) {
       int[] nums = {3,5,5,8,8,3,10};
       int eor=0;
       for(int i=0;i<nums.length;i++){
           eor = eor^nums[i];
      }
       System.out.println("奇数="+eor);
  }

输出:

奇数=10

因为相同数字异或是0,所以其中的所有偶数的数据结果都是0,最后结果就剩下 0^10 = 10

 

 

 

 

 

以上是关于位运算 : 巧妙使用异或(^)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 java hashCode() 中经常使用异或,而很少使用其他位运算符?

面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)

位运算1720. 解码异或后的数组

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字