Autor: Zhai Tianbao Steven
Declaração de direitos autorais: Os direitos autorais pertencem ao autor. Para reimpressão comercial, entre em contato com o autor para obter autorização. Para reimpressão não comercial, indique a fonte
Descrição do título:
Escreva uma função para encontrar a soma de dois inteiros. É necessário que os quatro operadores aritméticos +, -, *, / não sejam usados no corpo da função.
Intervalo de dados: Ambos os números satisfazem −10≤n≤1000
Avançado: Complexidade de espaço O(1), complexidade de tempo O(1)
Exemplo:
digitar:
1,2
valor de retorno:
3
Ideias para resolver problemas:
Esta questão examina as operações de bit. Duas maneiras de resolver o problema.
1) Operações de bit - não recursivas
Além disso, para o mesmo bit, se ambos são 0, é 0, se existe 1 e 0, é 1, se existem dois 1s, o bit atual é 0 e existe um carry 1; a operação OR exclusiva ^ pode obter o non-carry dos dois números, e o shift à esquerda 1 após a operação AND pode obter o carry dos dois números; o non-carry e o carry realizam uma operação XOR e a operação AND novamente, se não houver carry, é equivalente à soma dos dois; se aparecer um novo carry, repita a operação acima até que o carry desapareça.
2) Operação de bit - recursão
A operação recursiva é equivalente a executar o loop while recursivamente, e o princípio é o mesmo.
Código de teste:
1) Operações de bit - não recursivas
class Solution {
public:
int Add(int num1, int num2) {
// add表示进位值
int add = num2;
// sum表示总和
int sum = num1;
// 当不再有进位的时候终止循环
while(add != 0) {
// 将每轮的无进位和与进位做异或运算
int temp = sum ^ add;
// 进位通过用与运算左移1产生的
add = (sum & add) << 1;
// 更新
sum = temp;
}
return sum;
}
};
2) Operação de bit - recursão
class Solution {
public:
int Add(int num1, int num2) {
// 递归地求和
return num2 ? Add(num1 ^ num2, (num1 & num2) << 1) : num1;
}
};