c# - desplazamiento - Agregue dos enteros utilizando solo operadores bit a bit?
operadores de bits en c (7)
En C #, ¿es posible realizar una suma 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.
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.
Prueba esto:
private int add(int a, int b) {
if(b == 0)
return a;
return add( a ^ b, (a & b) << 1);
}
Editar: corregido if
declaración
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 ");
}
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 suma 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 suma de a
y b
.
Comentarios de geeksforgeeks
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;
}