En C #, est-il possible d’effectuer une somme de deux entiers 32 bits sans utiliser des éléments tels que if..else, loops, etc.?
Autrement dit, peut-on utiliser uniquement les opérations au niveau du bit OR (|
), AND (&
), XOR (^
), NOT (!
), décaler à gauche (<<
) et à droite (>>
)?
Voici un exemple pour votre amusement
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;
}
La boucle pourrait être déroulée. Le nombre de fois qu'il s'exécute dépend du nombre de bits définis dans les opérandes, mais n'est jamais supérieur à la largeur de unsigned int
. Une fois que carry
devient 0
, les prochaines itérations ne changent rien.
Essaye ça:
private int add(int a, int b) {
if(b == 0)
return a;
return add( a ^ b, (a & b) << 1);
}
Édition: Corrigé instruction if
Pensez à la façon dont l'addition se fait petit à petit. Décalez les valeurs pour obtenir chaque bit de chaque opérande, puis examinez les quatre valeurs possibles pour les deux bits et déterminez ce que le bit de résultat devrait être et s'il existe un bit de retenue à prendre en compte. Ensuite, voyez comment le résultat et le carry peuvent être calculés à l’aide des opérations au niveau du 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;
}
Prendre 32 bits en tant qu'int prend 32 bits. Merci!!!
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 somme de deux bits peut être effectuée à l'aide de l'opérateur XOR ^
et le bit de transfert peut être obtenu à l'aide de l'opérateur AND &
. Fourni a
et b
n’a pas mis les bits à la même position, puis l’utilisation de l’opérateur ^
donne la somme de a
et b
.
Commentaires de geeksforgeeks