Agregue dos enteros utilizando solo operadores bit a bit?

En C #, ¿es posible realizar una sum de dos enteros de 32 bits sin usar cosas como if … else, loops, etc.?

Es decir, ¿se puede hacer utilizando solo las operaciones en modo bit OR ( | ), Y ( & ), XOR ( ^ ), NO ( ! ), Desplazar hacia la izquierda ( << ) y desplazar hacia la derecha ( >> )?

Aquí hay un ejemplo para su diversión

 unsigned int myAdd(unsigned int a, unsigned int b) { unsigned int carry = a & b; unsigned int result = a ^ b; while(carry != 0) { unsigned int shiftedcarry = carry < < 1; carry = result & shiftedcarry; result ^= shiftedcarry; } return result; } 

El bucle podría desenrollarse. El número de veces que se ejecuta depende del número de bits establecidos en los operandos, pero nunca es mayor que el ancho de unsigned int . Una vez que carry convierte en 0 , las siguientes iteraciones no cambian nada.

Prueba esto:

  private int add(int a, int b) { if(b == 0) return a; return add( a ^ b, (a & b) < < 1); } 

Editar: corregido if statement

Piensa en cómo sucede la adición poco a poco. Cambie los valores para obtener cada bit de cada operando uno por uno, luego observe los cuatro valores posibles para los dos bits y resuelva cuál debe ser el bit de resultado y si hay algo de qué preocuparse. Luego vea cómo se puede calcular el resultado y el acarreo usando las operaciones en modo bit.

 public static int getSum(int p, int q) { int carry=0, result =0; for(int i=0; i<32; i++) { int n1 = (p & (1< <(i)))>>(i); //find the nth bit of p int n2 = (q & (1< <(i)))>>(i); //find the nth bit of q int s = n1 ^ n2 ^ carry; //sum of bits carry = (carry==0) ? (n1&n2): (n1 | n2); //calculate the carry for next step result = result | (s< <(i)); //calculate resultant bit } return result; } 

Tomando 32 bit como int toma 32 bit. ¡¡¡Gracias!!!

 static int binaryadd(int x, int y) { while (x != 0) { int c = y & x; y = y ^ x; x = c < < 1; } return y; } 
 int Add(int a, int b) { int result = 0, // carry now contains common set bits of "a" and "b" carry = a & b; if (Convert.ToBoolean(carry)) { // Sum of bits of "a" and "b" where at least one // of the bits is not set result = a ^ b; // carry is shifted by one so that adding it // to "a" gives the required sum carry = carry < < 1; result = add(carry, result); } else { result = a ^ b; } return result; } 

La sum de dos bits se puede realizar utilizando el operador XOR ^ y se puede obtener el bit de acarreo utilizando el operador AND & . Siempre que a y b no tengan bits configurados en la misma posición, entonces usar ^ operador da la sum de a y b .

Comentarios de geeksforgeeks

  int b = 25; for (int t = 128; t > 0; t = t / 2) { if ((b & t) != 0) Console.Write("1 "); if ((b & t) == 0) Console.Write("0 "); } Console.WriteLine(); //b = (sbyte)~b; int e = 22; for (int t = 128; t > 0; t = t / 2) { if ((e & t) != 0) Console.Write("1 "); if ((e & t) == 0) Console.Write("0 "); } Console.WriteLine(); int c = b | e; for (int t = 128; t > 0; t = t / 2) { if ((c & t) != 0) Console.Write("1 "); if ((c & t) == 0) Console.Write("0 "); }