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;
}
};