在两个整数之间交换最右边的N位

cla*_*ong 3 c++ bit-manipulation

在现场C++编码访谈期间询问了这个问题.在那次采访中我没有提供一个好的答案.所以我希望在堆栈溢出时得到人们的反馈和建议.现在我已经有更多的时间来提出解决方案了,我相信我写了一个不错的解决方案.我认为这可以正常工作ab引用不同的整数.如果a并且b引用相同的整数,那么该整数将被破坏为0.

void SwapRightMostNBits(int& a, int& b, unsigned int n){

    if (n>31) { n=31; }
    int mask=static_cast<int>(pow(2,n)-1);

    a ^= (b & mask);
    b ^= (a & mask);
    a ^= (b & mask);
}
Run Code Online (Sandbox Code Playgroud)

MSa*_*ers 6

我认为这里的目的是

void SwapRightMostNBits(unsigned int& a, unsigned int& b, unsigned int n){

    unsigned int mask=(1U<<n) -1;
    unsigned int diff = (a^b) & mask;

    a ^= diff;
    b ^= diff;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这与您的解决方案一样使用3个XOR,但只使用一个屏蔽操作.另外,这在CPU寄存器上更友好.没有虚假的依赖链.最后,它有效&a==&b.