cla*_*ong 3 c++ bit-manipulation
在现场C++编码访谈期间询问了这个问题.在那次采访中我没有提供一个好的答案.所以我希望在堆栈溢出时得到人们的反馈和建议.现在我已经有更多的时间来提出解决方案了,我相信我写了一个不错的解决方案.我认为这可以正常工作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);
}
Run Code Online (Sandbox Code Playgroud)
我认为这里的目的是
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.
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |