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


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

    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

     

     

     

  • 相关阅读:
    ubuntu下安装oracle
    网站框架策划时的小技巧--页面原型篇
    中国电商价格欺诈何时休?
    系统升级日记(4):如何快速的修改Infopath中的各种URL
    系统升级日记(3)- 升级SharePoint解决方案和Infopath
    系统升级日记(2)- 升级到SharePoint Server 2013
    系统升级日记(1)- 升级到SQL Server 2012
    【译】《C# Tips -- Write Better C#》
    [.NET] 一步步打造一个简单的 MVC 电商网站
    反骨仔的 2016 年度全文目录索引
  • 原文地址:https://www.cnblogs.com/sunjiguang/p/14827984.html
Copyright © 2020-2023  润新知