Operación de bits (arriba)

Diario de novatos-18 de enero

Caso 1:

Determine el número emparejado único en la matriz

1 ~ N-1 En una matriz de longitud N, solo se repite el valor de un elemento y los demás solo aparecen una vez. A
cada elemento de la matriz solo se puede acceder una vez. Diseñe un algoritmo para averiguarlo sin espacio auxiliar

* El primer método
construye una nueva matriz y realiza una operación AND

Primero construye la matriz

public class 数组中确定唯一成对的数 {
    
    
    public static void main(String[] args) {
    
    
    int N = 11;		//N可自己自行设置
    int[] arr = new int[N];
    for (int i = 0; i < arr.length-1; i++) {
    
    
        arr[i] = i + 1;}

Tome un número aleatorio para el último número e intercambie la posición con el elemento aleatorio anterior

	//最后一个数取随机数
    arr[arr.length-1] = new Random().nextInt(N-1)+1;
    //随机下标
    int index = new Random().nextInt(N);
    //最后一个数与前面随机一个数互换位置
    int t=arr[N-1];
    arr[N-1]=arr[index];
    arr[index]=t;
    System.out.println(Arrays.toString(arr));
    int x = 0;

Construya una nueva matriz y realice la operación Y y la salida

	//构造一个1~N-1的数组
    for (int i = 0; i < N-1; i++) {
    
    
        x = x ^ (i + 1);
        }
    //新数组与旧数组作亦或运算,其余相同的数亦或为零
    //而成对的数加新数组里面那个数则有3个,所以亦或结果便是成对的那个数
    for (int i = 0; i < N; i++) {
    
    
        x ^= arr[i];
        }
    System.out.println(x);

* El segundo método

Solución de espacio auxiliar (fuerza bruta)

int[] f = new int[N];
        for (int i = 0; i <N ; i++) {
    
    
            f[arr[i]] += 1;//原先每个元素都是0,现在给下标为arr[i]的每个都加1
                            //因为其中有两个数是一样的,所以会加两次
        }
        //System.out.println(Arrays.toString(f));
        for (int i = 0; i < N; i++) {
    
    
            //当新数组中某个元素等于2时,那么他的下标就是重复的那个数
            // (因为第一个元素被0占用了,所以下标不用加一)
            if(f[i]==2){
    
    
                System.out.println(i);
            }
        }
    }
}

Imagen de efecto:

El resultado es diferente cada vez
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Caso 2:

Hallar el número de '1' en binario

Ingrese un número entero y determine cuántos '1 hay en su sistema binario

Hay tres soluciones

1. Compare de derecha a izquierda

public class 二进制中1的个数 {
    
    
    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        System.out.println(Integer.toString(N,2));
        //1.从右往左挨个比对是否为1
        int count1 = 0;
        for (int i = 0; i < 32; i++) {
    
    
            if ((N&(1<<i))==(1<<i)){
    
    
                count1++;
            }
        }
        System.out.println(count1);

2. Comparar de izquierda a derecha

	int count2 = 0;
        for (int i = 0; i < 32; i++) {
    
    
            if (((N>>i)&1)==1){
    
    
                count2++;
            }
        }
        System.out.println(count2);

3. Método de resta 1.
Al restar 1 del número ingresado y el número original, hay varios

	int count3 = 0;
        //因为不知道要循环几次,所以用while
        while (N != 0){
    
    
            N = (N-1)&N;
            count3++;
        }
        System.out.println(count3);
    }
}

El siguiente es un diagrama del método de resta, que es un poco descuidado, no importa.
Suponiendo que el número ingresado es 20, hay dos 1, entonces será lo mismo que las dos
Inserte la descripción de la imagen aquí
representaciones:
Inserte la descripción de la imagen aquí

Caso 3:

¿Es un poder de 2?

Ingrese un número y juzgue si es una potencia entera de 2.
Pensamiento: cuando un número tiene y solo un 1 en los dígitos binarios, entonces es una potencia entera de 2, por
ejemplo: 8 tiene solo el cuarto dígito de derecha a izquierda Es uno, 64 es el séptimo

public class 是不是2的整次方 {
    
    
    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int a = 2;
        if ((N & (N - 1)) == 0){
    
    
            System.out.println("yes");
        }
        else {
    
    
            System.out.println("no");
        }
    }
}

Imagen de efecto:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Caso 4:

Intercambio de paridad

Proporcione un número entero, intercambie su paridad binaria y verifique si el intercambio es exitoso. Por
ejemplo, el binario de 9 es: 1001, después de intercambiar la paridad: 0110 es igual a 6.

public class 交换奇偶位 {
    
    
    public static void main(String[] args) {
    
    
        int a = 9;
        int b = huan(a);
        //验证换位是否成功,9奇偶位互换等于6
        int c = 6;
        System.out.println(b);
        if (c == b){
    
    
            System.out.println("yes");
        }
    }

    private static int huan(int i) {
    
    
    	//这里用二进制太长了,我用十六进制表示
        int ji = i & 0x55555555; //和1010 1010 1010 1010......做与运算取出奇数位
        int ou = i & 0xaaaaaaaa; //和0101 0101 0101 0101......做与运算取出偶数位
        return (ji << 1) ^ (ou >> 1); //合并成一个二进制数
    }
}

Ilustración:
Suponiendo que el número a intercambiar son 9
Inserte la descripción de la imagen aquí
representaciones:
Inserte la descripción de la imagen aquí

más !!!
El final de un día frío y satisfactoria.

Supongo que te gusta

Origin blog.csdn.net/ghl971/article/details/112786217
Recomendado
Clasificación