2016-07-21 20 views
-3

我看到了一些解決方案,但看起來很複雜。在給定的整數中交換兩位

在n,m位中兩個位之間交換最有效的方法是什麼?

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

檢查:[鏈接1](http://www.geeksforgeeks.org/swap-bits-in-a-given-number/) – Vaibhav

+0

爲什麼會交換兩個位的函數採取'INT num' ? – 4386427

+0

取int,交換兩位數並返回交換後的新號碼 –

回答

2

不知道這是最有效的,但我認爲這是一個相當簡單的解決方案:更有效的(但不讀)的方式

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; 
} 

相同的解決方案:

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; 
} 

and last:

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

給定整數n,其中我們想要在位置p1和p2處交換位: 算法:如果兩個位相同,則返回相同的值,否則使用XOR切換兩個位。

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))); 
}