Niukewang Jianzhi ofrece una pregunta simple 2

Realice la suma de enteros sin símbolos aritméticos

Requisitos de la asignatura:

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

análisis:

Si no utiliza símbolos aritméticos, debe utilizar símbolos aritméticos de bits lógicos como &, |,! , >>, <<, ^, etc. En la
computadora, un número entero positivo se almacena como su código original, y un
número negativo se almacena como su complemento = el complemento del código original +1.
Primero analice la suma de dos números positivos, como 11 + 13 = 24
11 = 0000 0000 0000 0000 0000 0000 0000 1011,
13 = 0000 0000 0000 0000 0000 0000 0000 1101,
24 = 0000 0000 0000 0000 0000 0000 0000 0001 1000.
Tenga en cuenta que la fórmula anterior tiene un acarreo, por lo que la suma de los dos números se puede dividir en dos partes : Carry part and no carry part
11 + 13 have no carry: 1000, carry: 0000 0000 0000 0000 0000 0000 0001
Para implementar este método,
primero analice el rol de cada operador:

Operando 1 Operando 2 versus o XOR
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

En segundo lugar, analiza si se necesita un carry

Operando 1 Operando 2 llevar No llevar
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

Observando las dos tablas anteriores, podemos ver que la operación AND obtiene la parte de acarreo, y el O exclusivo obtiene la parte de acarreo. Nota: La parte de acarreo debe desplazarse hacia la izquierda;
como se muestra a continuación:
11 = 0000 0000 0000 0000 0000 0000 0000 1011,
13 = 0000 0000 0000 0000 0000 0000 0000 1101
11 y 13 = 0000 0000 0000 0000 0000 0000 0000 0000 1001 Desplaza un bit hacia la izquierda para obtener:
= 0000 0000 0000 0000 0000 0000 0001 0010
11 ^ 13 = 0000 0000 0000 0000 0000 0000 0000 0110
pero a través de AND y El valor obtenido por XOR es simple o combinado y no puede obtener la solución correcta, de la siguiente manera:
(11 & 13) | (11 ^ 13) = 0000 0000 0000 0000 0000 0000 0001 0110 = 22, falta de acarreo en este proceso, entonces Necesita hacer un bucle hasta que no haya acarreo, por
lo tanto , es necesario determinar si se deben llevar dos números. Al observar la ley, se obtiene que cuando hay 1 en la operación AND se requiere un acarreo.

Código

public static int add(int num1,int num2){
    
    
        int sum1 = 0;
        int sum2 = 0;
        int sum = 0;

        while((num1&num2)!=0){
    
    
            sum1 = (num1&num2)<<1;
            sum2 = num1^num2;

            num1 = sum1;
            num2 = sum2;

        }
        sum = num1|num2;
        return sum;
    }

Supongo que te gusta

Origin blog.csdn.net/weixin_44712669/article/details/111278071
Recomendado
Clasificación