2016-07-21 33 views
-3

Ich sah ein paar Lösungen, aber es sieht komplex aus.Tauschen Sie zwei Bits in gegebener Ganzzahl

Was ist der effektivste Weg, um zwischen zwei Bits in n, m-Positionen zu tauschen?

int swapBits(int num, int nPostion, int mPosition); 
+2

Check this: [Link-1] (http://www.geeksforgeeks.org/swap-bits-in-a-given-number/) – Vaibhav

+0

Warum sollte eine Funktion tauschen zwei Bit nehmen 'int num' ? – 4386427

+0

Take int, tausche zwei Bits in der Zahl und geben die neue Zahl nach dem Swapping zurück –

Antwort

2

Nicht sicher ist es die effektivste, aber ich denke, das ist eine ziemlich einfache Lösung ist:

int bitValue(int num, int nPosition) 
{ 
    return (num >> nPosition) % 2; 
} 

int swapBits(int num, int nPosition, int mPosition) 
{ 
    int nVal = bitValue(num, nPosition); 
    int mVal = bitValue(num, mPosition); 

    if (nVal != mVal) 
    { 
     if (1 == nVal) 
     { 
      num -= 1<<nPosition; 
      num += 1<<mPosition; 
     } 
     else 
     { 
      num += 1<<nPosition; 
      num -= 1<<mPosition; 
     } 
    } 

    return num; 
} 

Gleiche Lösung in einer effizienteren (aber weniger lesbar) Art und Weise:

int swapBits2(int num, int nPosition, int mPosition) 
{ 
    int nVal = (num >> nPosition) % 2; 
    int mVal = (num >> mPosition) % 2; 

    if (nVal != mVal) 
    { 
     num += (-1)*(2*mVal-1)*(1<<mPosition) + (-1)*(2*nVal-1)*(1<<nPosition); 
    } 

    return num; 
} 

und zuletzt:

int swapBits3(int num, int nPosition, int mPosition) 
{ 
    int k = ((num >> nPosition) & 1) - (num >> mPosition) & 1; 

    return num + k*(1<<mPosition) - k*(1<<nPosition); 
} 
3

Gegebene Ganzzahl n, in der wir das Bit an der Stelle p1 und p2 austauschen möchten: Algorithmus: Wenn beide Bits gleich sind, dann gebe einfach denselben Wert zurück, ansonsten beide Bits mit XOR umschalten.

unsigned int swapBits(unsigned int n, unsigned int p1, unsigned int p2) 
{ 
    return (((n >> p1) & 1) == ((n >> p2) & 1) ? n : ((n^(1 << p2))^(1 << p1))); 
}