Oferta Jianzhi(C++)-JZ65: Adição sem adição, subtração, multiplicação e divisão (operação de bit de algoritmo)

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

Acho que você gosta

Origin blog.csdn.net/zhaitianbao/article/details/131852191
Recomendado
Clasificación