位运算的一些应用(二)

目录

简介:   

应用:

1.用二进制表示一个int类型的整数

2.使用异或判断2个对象有一个不为空

3.使用异或进行数组交换

4.一个数组中,某个数出现奇数次,其他都是偶数次,找到出现奇数次的数

5.一个数组中,a,b出现奇数次,其他都是偶数次,找到出现奇数次的数


简介:   

    在java里int的范围是 [−2^{31} ~ 2^{31}-1],共2^{32}个数,占32个字节,其中第一位是符号位 ,1表示负数,0表示整数。

符号名称作用
&同1为1,其他为01&2 结果为0
|不同为1,同1为1,同0为01|2 结果为3
!逻辑取反!true结果为false
~取反原1为0,原0为1~1结果为-2
^异或相同为0,不同为11^2结果为3

例如:

1的二进制表示为:0000 0000 0000 0000 0000 0000 0000 0001

-1的二进制表示为:1111 1111 1111 1111 1111 1111 1111 1111

其中负数的表示为 整数取反~ + 1

应用:

1.用二进制表示一个int类型的整数

二进制中的有效数字位共31位,通过&的特性,同1为1,其他为0,

输入参数&1<<i,就能找到二进制位为1的位置,代码如下

 public static String print(int num){
        StringJoiner joiner = new StringJoiner("");
        for(int i = 31;i>=0;i--){
            joiner.add((num & (1 << i))== 0 ? "0" : "1" );
        }
        return joiner.toString();
    }

效果如下:

2.使用异或判断2个对象有一个不为空

其中User u1 = new User(); User u2 = new User();

public static boolean notBothNull(User u1,User u2){
    if(u1 == null ^ u2 == null){
        return true;
    }
    return false;
}

当u1,u2中有一个不为空则返回true.否则返回false.

3.使用异或进行数组交换

根据异或的特性,相同的两个数异或结果是0,a^b^a  的结果是b,当然这里有个前提,a!=b

private static void swap(int[] arr, int a, int b) {
        if (a != b) {
            arr[a] = arr[a] ^ arr[b];
            arr[b] = arr[a] ^ arr[b];
            arr[a] = arr[a] ^ arr[b];
        }
    }

4.一个数组中,某个数出现奇数次,其他都是偶数次,找到出现奇数次的数

public int odd(int[] arr){
        int ans = 0;
        for (int i = 0; i < arr.length; i++) {
            ans ^= arr[i];
        }
        return ans;
    }

5.一个数组中,a,b出现奇数次,其他都是偶数次,找到出现奇数次的数

public int[] odd(int[] arr){
        int ans = 0;
        for (int i = 0; i < arr.length; i++) {
            ans ^= arr[i];
        }
        // 提取出最又一个1
        int rightOne = ans & (~ans + 1);
        int ans1 = 0;
        for (int i = 0; i < arr.length; i++) {
            if((arr[i] & rightOne)!=0){
              ans1 ^ = arr[i];
            }
        }

        return new int[]{ans1,ans1^ans};
    }

a,b出现奇数次,ab一定 不相等,通过应用4,得到ans = a^b;

如果ans = 4,二进制表示为:0100,说明,a,b中一定有一个数的第三位上是1;

在数组中找到第三位是1的所有的数,应用异或特性,找到其中的一个数ans1;

另一个数即为ans^ans1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值