在给定的整数中交换两位

时间:2016-07-21 10:16:03

标签: c bit-manipulation byte bitwise-operators bit

我看到了一些解决方案,但看起来很复杂。

在n,m位置中交换两位之间最有效的方法是什么?

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

4 个答案:

答案 0 :(得分:5)

给定整数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)));
}

答案 1 :(得分: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;
}

和最后:

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

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

答案 2 :(得分:0)

您可以使用以下宏来避免临时变量或堆栈分配,并且该宏可以与任何数字类型一起使用:

#define SWAP_BITS(v,b1,b2) \
    (((v)>>(b1)&1)==((v)>>(b2)&1)?(v):(v^(1ULL<<(b1))^(1ULL<<(b2))))

答案 3 :(得分:0)

以Shay Gold的解决方案为基础,以下是其中一些错误修复的解决方案:

unsigned int swapBits(unsigned int num, int nPosition, int mPosition) {
    unsigned int k = ((num >> nPosition) & 1) - ((num >> mPosition) & 1);
    return num + k * ((1U << mPosition) - (1U << nPosition));
}