2017-07-27 70 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

那么,人们可以使用临时变量.. –