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

标签 c++ bit-manipulation

这个问题是在现场 C++ 编码面试中提出的。在那次采访中我没有提供一个好的答案。所以我希望在 stack overflow 得到人们的反馈和建议。现在我有更多的时间来想出一个解决方案,我相信我写了一个不错的解决方案。我认为这可以正常工作,因为 ab 指的是不同的整数。如果 ab 引用相同的整数,那么该整数将被破坏为 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);
}

最佳答案

我认为这里的预期技巧是

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

请注意,这使用了 3 个 XOR,就像您的解决方案一样,但只使用了一个掩码操作。另外,这对 CPU 寄存器更友好。没有错误的依赖链。最后,它在 &a==&b 时有效。

关于c++ - 在两个整数之间交换最右边的 N 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45968923/

相关文章:

c# - 如何更改大量现有代码中的命名约定?

c++ - 如果多次找到其他组,如何使组成为强制性组

php - 为财务打印机解码自定义 CRC 算法

php - C 和 PHP : Storing settings in an integer using bitwise operators?

java - 滑下金字塔时通过位移来决定向左或向右的方向

c++ - 如何访问 integer_sequence 的第 n 个值?

c++ - 如何在完美转发中有效地将右值引用转为左值

c++ - 如何避免传递函数

c - 如何使用按位运算来补充最右边的位以保持前导零位为零?

c - 使用按位运算符的 Sizeof 函数