位运算

92 阅读1分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。

位运算

基础知识

异或非/取反
&|^~

截屏2022-01-27 下午7.42.40 '>>' 和'<<'运算符可以将计算机中用来储存数字的二进制位右移或者左移一位。 '>>>'运算符在位移的时候会用0填充高位,'>>'会用符号位来填充高位,没有'<<<运算符'。 如果位移运算符位移的位数大于数据类型存放数据位数大小,会进行取余后在进行位移操作,比如:1<<35和1<<3是一样的。

在java语言中计算机储存数字是按补码储存的。

正数:补码=反码=原码;

负数:补码=反码+1;

题目

1).如何找到数组中唯一成对的那个数?

截屏2022-01-28 上午11.28.04

2).找出唯一落单的那个数

截屏2022-01-28 上午11.43.35

思路:利用异或运算来计算这个数字

从规律3中可以看出任意一个数字异或自身为0,任意一个数字异或0为自身。利用这一条规律我们可以解决这个问题。

1)解:

package 蓝桥杯;


import java.util.Random;

public class Test1 {
    public static void main(String[] args) {
        // 构建数组
        int [] a = new int[1001];
        int N = 1001;
        for (int i = 0; i < N - 1; i++) {
            a[i] = i + 1;
        }
        a[N - 1] = new Random().nextInt(N - 1) + 1;
        // 重复的数
        System.out.println(a[N - 1]);
        int index = new Random().nextInt(N);
        int t = a[N - 1];
        a[N - 1] = a[index];
        a[index] = t;

        // 查找重复的数
        t = 0;
        for (int i = 0; i < N; i++) {
            t = (t^i);
        }
        for (int i = 0; i < N; i++) {
            t = (t^a[i]);
        }
        System.out.println(t);
    }
}

2)解:

package 蓝桥杯;

public class Test2 {
    public static void main(String[] args) {
        int [] a = {1,1,2,2,3,4,4,5,5};
        
        int t = 0;
        for (int i = 0; i < a.length; i++) {
            t = (t^a[i]);
        }
        
        System.out.println(t);
    }
}