异或运算的效率如此之高,这些操作你都知道吗?

异或运算在编程中有着独特的性质,如交换律、结合律和自我消去性。它常用于无额外空间交换两个数、判断数值相等及找出数组中唯一出现一次的数字。在算法题中,例如在一个包含1000个不同数字和一个重复数字的数组中,可通过异或运算找到那个重复的数字。
部署运行你感兴趣的模型镜像

异或

是一种基于二进制的位运算,“^”为双目运算符。运算规则如下:

0^0 = 0,

1^0 = 1,

0^1 = 1,

1^1 = 0

总结起来就是一句话:同为0,异为1.

三大性质:

1.交换律:a ^ b=b ^ a;

2.结合律:(a ^ b) ^ c=a ^(b ^ c)

3.a ^ a=0; a ^ 0 =a;a ^ (-1)=~a;

总结:0异或任何数=任何数;1异或任何数=任何数取反;任何数异或自己=把自己置0

用途

1.交换两个数的位置(不需要使用第三方变量)

   @Test
    public void test(){
        int a=9;
        int b=8;
        a=a^b;
        b=b^a;
        a=a^b;
        System.out.println("a="+a+",b="+b);
    }

2.快速判断出两个数的值是否相等

   @Test
    public void test5(){
        //判断连个数的值是否相等
        int b=12;
        int c=12;
        System.out.println((c^b)==0);
    }

3.找出数组中只出现一次的数字,其它数字都出现了两次

   @Test
    public void test7(){
        int[] arr={1,6,2,6,3,1,2,4,4};
        int x=0;
        for (int i = 0; i <arr.length ; i++) {
            x^=arr[i];
        }
        System.out.println(x);
    }

经典算法题:

1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?

@Test
    public  void dobuleNum(){
        int N=1001;
        int[] arr = new int[N];
        for (int i = 0; i < arr.length -1; i++) {
            arr[i]=i+1;
        }
        //最后一个数为随机数
        arr[arr.length -1]= new Random().nextInt(N -1)+1;
        Utils.print(arr);
        int x=0;
        for (int i = 1; i <=N-1 ; i++) {
            x=(x ^ i);
        }
        for (int i = 0; i < N; i++) {
            x=(x ^ arr[i]);
        }
        System.out.println("重复的值为:"+x);
    }

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值