bits binarios invertidos leetcode190

Descripción del problema:

Invierta los bits binarios de un entero sin signo de 32 bits dado.

Ejemplo 1:

输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
     因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000

Ejemplo 2:

输入:11111111111111111111111111111101
输出:10111111111111111111111111111111
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
     因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111

inmediato:

Tenga en cuenta que en algunos lenguajes (como Java), no hay ningún tipo de entero sin signo. En este caso, tanto la entrada como la salida se designarán como tipos de enteros con signo y no deberían afectar su implementación, porque la representación binaria interna es la misma independientemente de si el entero tiene o no signo.
En Java, el compilador usa la notación de complemento a dos para representar enteros con signo. Por lo tanto, en el ejemplo 2 anterior, la entrada representa un entero con signo -3 y la salida representa un entero con signo -1073741825.

Ideas de resolución de problemas:

1. Da la vuelta a un número binario, que es similar a un número entero. Primero debes obtener el último bit del número binario. Puede realizarse mediante la operación AND (n & 1).
La operación & satisface dos 1 iguales, y el resultado es 1, de lo contrario es 0. Aquí y 1 se usa para la operación Y, y el resultado final es el mismo que el último bit de n.

2. Después de obtener el último valor, debe obtener el penúltimo valor, que se puede lograr cambiando: n >> 1, de modo que el penúltimo valor se mueva al último. Solo necesitamos cambiar 32 veces para obtener todos los valores de bits binarios de n.

3. Utilice res para guardar cada bit binario.

Código de implementación

public class Solution {
    
    
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
    
    
        int res=0;      //用res保存n的各个二进制位
        for(int i=0;i<32;i++){
    
    
            //这里让res先左移的原因是因为从最后一个位开始,每个位左移32-i位,则第1位左移31次,所以res左移放在最前面
            res=res<<1;      
            //如果当前n的末位是1,那么res++,保证左移完后,res的该位也为1
            if((n & 1)==1){
    
    
                res++;
            }
            //n右移,得到n的倒数第i位
            n=n>>1;
        }
        return res;
    }
}

punto importante:

En Java no hay números sin signo, solo números con signo. El desplazamiento de los números con signo es un
desplazamiento aritmético. El objeto del desplazamiento aritmético es un número con signo. El bit de signo permanece sin cambios durante el desplazamiento.
Para números positivos, las vacantes que aparecen después del cambio se llenan todas con 0.
Para números negativos, la parte del valor del código original del número negativo es el mismo que el valor verdadero, el bit de signo permanece igual al cambiar y el espacio se agrega a 0.
Los bits de código inverso del número negativo son opuestos al código original del número negativo excepto por el bit de signo Por lo tanto, el código agregado después del cambio debe ser contrario al código original, todos agregan 1
por lo que el resultado de los números negativos del cambio a la derecha en Java sigue siendo negativo.
Aquí, si los bits binarios se invierten y se rellenan de mayor a menor, puede producirse un error.
Como el código escrito al principio del título

Supongo que te gusta

Origin blog.csdn.net/qq_39736597/article/details/113921619
Recomendado
Clasificación