Oferta 65 de Sword Finger. No es necesario sumar, restar, multiplicar y dividir para sumar

Escribe una función para encontrar la suma de dos números enteros. Los cuatro símbolos aritméticos "+", "-", "*" y "/" no deben usarse en el cuerpo de la función.

Ejemplo:

Entrada: a = 1, b = 1
Salida: 2

inmediato:

a, b 均可能是负数或 0
结果不会溢出 32 位整数

Supuesto:
el valor binario de a es 1011 y el valor binario de
b es 1110.
Para el resultado de sumar ayb, es: 0101 (sin acarreo) // es decir, la operación OR exclusiva

Y el resultado del acarreo es el valor de 1010, que se desplaza un lugar a la izquierda // y después de la operación, se desplaza a la izquierda

Luego suma estos dos valores juntos

La adición aquí puede ser similar a la adición de ayb para repetir la última operación

Es decir, trate la operación XOR como un

Muévase a la izquierda después de la operación AND como b

Repetir operación

¿Cuándo termina? Naturalmente, cuando b == 0, el resultado XOR es la respuesta real.

El detalle al que se debe prestar atención es que la representación binaria de int tiene un total de 32 bits.
El bit más a la izquierda se usa para manejar positivo y negativo, por lo que el máximo int es 2 ^ 31-1.
Entonces, si el bit más a la izquierda es 1, entonces es un número negativo, y un número negativo El desplazamiento a la izquierda no está definido,
por lo que debe definir un valor de
01111111 11111111 11111111 11111111
para que este valor sea el acarreo de ayb, y el valor más a la izquierda del valor de desplazamiento a la izquierda debe ser 0, que es un número positivo.

class Solution {
    
    
public:
    int add(int a, int b) {
    
    

        int x = ~(1 << 31);

        while(b)
        {
    
    
            int a1=a^b;
            int b1=(a&b&x)<<1;
            a=a1;
            b=b1;
        }
        return a;
    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_43624038/article/details/113810549
Recomendado
Clasificación