Étant donné un entier n et des positions de deux bits p1 et p2 à l'intérieur, échangez les bits aux positions données. Les positions données sont à partir du bit le moins significatif (lsb). Par exemple, la position de lsb est 0.
Exemples : 

Entrée : n = 28, p1 = 0, p2 = 3
Sortie : 21
Explication : 28 en binaire est 11100. Si nous échangeons le 0' et le 3ème chiffre, nous obtenons 10101 qui est 21 en décimal.

Entrée : n = 20, p1 = 2, p2 = 3
Sortie : 24

Nous vous recommandons fortement de minimiser votre navigateur et d'essayer vous-même d'abord.
Méthode 1: 
L'idée est de trouver d'abord les bits, puis d'utiliser le concept d'échange basé sur XOR , c'est-à-dire que pour échanger deux nombres 'x' et 'y', nous faisons x = x ^ y, y = y ^ x , et x = x ^ y.

Ci-dessous la mise en œuvre de l'idée ci-dessus

int swapBits(unsigned int n, unsigned int p1, unsigned int p2)
{
    /* Move p1'th to rightmost side */
    unsigned int bit1 =  (n >> p1) & 1;
 
    /* Move p2'th to rightmost side */
    unsigned int bit2 =  (n >> p2) & 1;
 
    /* XOR the two bits */
    unsigned int x = (bit1 ^ bit2);
 
    /* Put the xor bit back to their original positions */
    x = (x << p1) | (x << p2);
 
    /* XOR 'x' with the original number so that the
       two sets are swapped */
    unsigned int result = n ^ x;
}
 
/* Driver program to test above function*/
int main()
{
    int res =  swapBits(28, 0, 3);
    printf("Result = %d ", res);
    return 0;
}
Production
Résultat = 21

Complexité temporelle : O(1)
Espace auxiliaire : O(1)

int swapBits(int n, int p1, int p2)
{
    //left-shift 1 p1 and p2 times
    //and using XOR
    if (((n & (1 << p1)) >> p1) ^ ((n & (1 << p2)) >> p2))
    {
      n ^= 1 << p1;
      n ^= 1 << p2;
    }
    return n;
}
 
//Driver Code
int main()
{
    printf("Result = %d", swapBits(28, 0, 3));
    return 0;
}
Production
Résultat = 21

Complexité temporelle : O(1)
Espace auxiliaire : O(1)

Modifié le: mardi 16 août 2022, 20:05