在两个整数之间交换最右边的N位 这个问题是在现场C++编码面试中被问到的。在那次采访中,我没有给出一个好的答案。所以我希望从stack overflow的同事那里得到反馈和建议。现在我有更多的时间来提出一个解决方案,我相信我写了一个不错的解决方案。我认为这是可行的,因为a和b引用不同的整数。如果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); } void SwapRightMostNBits(int&a、int&b、无符号int-n){ 如果(n>31){n=31;} int mask=静态施法(功率(2,n)-1); a^=(b和掩码); b^=(a和掩码); a^=(b和掩码); }

在两个整数之间交换最右边的N位 这个问题是在现场C++编码面试中被问到的。在那次采访中,我没有给出一个好的答案。所以我希望从stack overflow的同事那里得到反馈和建议。现在我有更多的时间来提出一个解决方案,我相信我写了一个不错的解决方案。我认为这是可行的,因为a和b引用不同的整数。如果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); } void SwapRightMostNBits(int&a、int&b、无符号int-n){ 如果(n>31){n=31;} int mask=静态施法(功率(2,n)-1); a^=(b和掩码); b^=(a和掩码); a^=(b和掩码); },c++,bit-manipulation,C++,Bit Manipulation,我想这里的技巧是 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; } void SwapRightMostNBits(无符号整数和a、无符号整数和b、无

我想这里的技巧是

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;
}
void SwapRightMostNBits(无符号整数和a、无符号整数和b、无符号整数和n){

无符号int掩码=(1uIF <代码> n>31 < /代码>为什么要将它设置为31?我至少会考虑> 31超出范围,并且在这种情况下不交换任何东西。也可以轻松计算<代码>掩码=(1整数的POW)>采访失败,NEXT,而不是POW(2,N)。使用1这不是面试失败。谁真的在乎呢。有人可能会说你应该说出你的意思。在这里转移并不重要。@Ron:我倾向于从一个这样的问题开始。如果你参加了面试,这应该很容易。即使你有点小,这也应该有助于缓解紧张情绪。我并不真的在乎答案,它更重要我判断下一步该问什么的方法。通过“虚假依赖链”,你的意思是加载命中存储,对吗?谢谢MSalters,这看起来是一个更好的解决方案!@Frank:不,这是一个值从内存中来回移动的时候。现代CPU尝试并行执行N条指令,这只有在第N条指令不依赖于之前的N-1条指令的情况下才有可能。这就是为什么CPU会动态运行的原因res去掉依赖关系,这些依赖关系可以链接起来。“经典的异或交换”遇到这样一个问题,即最终的A值同时依赖于A和B,因为它们是异或运算,B也是异或运算,这意味着第一个异或运算必须在下一个操作开始之前完成。@我关心的是MSalters。删除OP的LHS比释放OOO执行产生的影响要大得多(可能是CPU管道的10倍左右)。@Frank:嗯,它们结合在一起。OOOE还允许您在等待加载指令时启动新指令。在我的示例中,
a^b
可以立即启动。a^b
可能需要一段时间才能完成,但当它完成时,掩码可用。