web-dev-qa-db-fra.com

Ajouter deux entiers en utilisant uniquement des opérateurs au niveau des bits?

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 (>> )?

37
Delta

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.

58
Maciej Hehl

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

20
Shatazone

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.

6
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!!!

2
Trying
static int binaryadd(int x, int y)
{
  while (x != 0)
  {
    int c = y & x;
    y = y ^ x; 
    x = c << 1;             
  }
  return y;
}
2
stt106
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

0
John Kennedy