É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 : 24Nous 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
intswapBits(unsignedintn, unsignedintp1, unsignedintp2){/* Move p1'th to rightmost side */unsignedintbit1 = (n >> p1) & 1;/* Move p2'th to rightmost side */unsignedintbit2 = (n >> p2) & 1;/* XOR the two bits */unsignedintx = (bit1 ^ bit2);/* Put the xor bit back to their original positions */x = (x << p1) | (x << p2);/* XOR 'x' with the original number so that thetwo sets are swapped */unsignedintresult = n ^ x;}/* Driver program to test above function*/intmain(){intres = swapBits(28, 0, 3);printf("Result = %d ", res);return0;}ProductionRésultat = 21Complexité temporelle : O(1)
Espace auxiliaire : O(1)intswapBits(intn,intp1,intp2){//left-shift 1 p1 and p2 times//and using XORif(((n & (1 << p1)) >> p1) ^ ((n & (1 << p2)) >> p2)){n ^= 1 << p1;n ^= 1 << p2;}returnn;}//Driver Codeintmain(){printf("Result = %d", swapBits(28, 0, 3));return0;}ProductionRésultat = 21Complexité temporelle : O(1)
Espace auxiliaire : O(1)