慎用异或运算符

异或运算符的特点是:一个整型[初始值] 异或 另一个整型 得到的还是 初始值。

今天在做个打乱数组内值的循环的时候,用异或来交换两个随机下标的值,输出结果发现却是混乱的。
代码如下:

import java.util.Random;

public class index {
    public static void main(String[] args){

        //定义一个长度为 101 的整型数组
        int[] init = new int[101];
        //向数组内初始化数据(为 0-100)
        Integer initLen = init.length;
        for (int i=0;i<initLen;i++) {
            init[i] = i;
        }

        //打乱数组
        Random r = new Random();
        for (int x=0;x<1000;x++){
            int y = r.nextInt(initLen);
            int j = r.nextInt(initLen);

            init[y] = init[y] ^ init[j];
            init[j] = init[y] ^ init[j];
            init[y] = init[y] ^ init[j];
        }


        printArr(init);

    }


    /***
     * 输出数组
     * @param arr
     */
    public static void printArr(int[] arr){
        Integer arrLen = arr.length;
        for (int i=0;i<arrLen;i++) {
            System.out.println(arr[i]);
        }
    }
}

这里写图片描述

导致问题的原因是:

/***
   上面代码中是利用两个随机数做下标,既然是随机那么就有可能出现重复的可能性。如果两个随机数一致,那么就会导致
   结果混乱。比如两个随机数都是 10,得到的数组值就是 10。init[10] = init[10] ^ init [10] 其实就是 
   10 ^ 10; 这时候 int[10] 的值就是 0 了,那么这时候进行反转的时候就是 init[10] = init[10] ^ init[10]
    就是 0 ^ 0 得到的还是 0。
**/

thanks~

猜你喜欢

转载自blog.csdn.net/xianhenyuan/article/details/80727822