2017-07-27 108 views
3

我只是嘗試使用此代碼之間的位:Ç - 交換兩個數字

void swapBit(unsigned char* numbA, unsigned char* numbB, short bitPosition)//bitPosition 0-x 
{ 
    unsigned char oneShift = 1 << bitPosition; 

    unsigned char bitA = *numbA & oneShift; 
    unsigned char bitB = *numbB & oneShift; 

    if (bitA) 
     *numbB |= bitA; 
    else 
     *numbB &= (~bitA^oneShift); 

    if (bitB) 
     *numbA |= bitB; 
    else 
     *numbA &= (~bitB^oneShift); 
} 

交換位位置x的A和B,但因爲如果()我認爲有更好的東西。

而且,當我看到這一點:

*numbB &= (~bitA^oneShift); 

我真的覺得有一個更簡單的方法來做到這一點。 如果您有什麼對我來說,我會採取它:)

在此先感謝

+1

這不是真的「交換數字的兩位」,更像是「在兩個數字之間交換位」或其他東西,儘管如此,這仍然是一個令人困惑的描述.. – harold

+0

第1步:使用無符號類型,更好地使用'1u << bitPosition'(添加'u') – chux

+0

謝謝,哈羅德,我修改了標題,我不介意.... Chux,我現在將使用它,謝謝:) –

回答

5

首先,你應該設置一些相應的位置0,然後或將其與實際的位,清除所有的條件:

*numbB &= ~oneShift; // Set the bit to `0` 
*numbB |= bitA;  // Set to the actual bit value 

其他數字相同。

+0

Very很好!非常感謝你 –

0

形成掩模

unsigned char mask = 1u << bitPosition; 

然後賺你的對等組的憤怒與XOR swap algorithm

*numbA ^= *numbB & mask; 
*numbB ^= *numbA & mask; 
*numbA ^= *numbB & mask; 

注意這個失敗時,numbA == numbB

+1

我想把它作爲一種替代方案,但是想起了最近一個問題中SO同伴的憤怒☺️ –

+0

@EugeneSh。國際海事組織,這是最終拒絕這種方法的'麻煩'numbB'問題,因爲這是一個令人驚訝的錯誤。 – chux

+0

那麼,人們可以使用臨時變量.. –