kas*_*sky 8 c++ bit-manipulation
在无符号整数中交换第一个(最低有效)2个不同连续位的快速而优雅的方法是什么?
例如
100100 -> 100010
110011 -> 110101
Run Code Online (Sandbox Code Playgroud)
到目前为止,我想出了这个:
unsigned long long special_swap(unsigned long long number)
{
if (number & 1)
return (number + 1) ^ ((number ^ (number + 1)) >> 2);
number = ~number;
return ~((number + 1) ^ ((number ^ (number + 1)) >> 2));
}
Run Code Online (Sandbox Code Playgroud)
我对上述解决方案的最大不满是它使用了该if指令.
我就是这样做的:
unsigned long long my_swap(unsigned long long number)
{
unsigned long long x = number ^ (number >> 1);
return number ^ ((x & -x) * 3);
}
Run Code Online (Sandbox Code Playgroud)
当 number == 0 时,我的解决方案返回 0,而原始问题的函数返回 11000000000000000000000000000000000000000000000000000000000000000。
一些解释:如果该位置的位与下一位相同,则 x 的位包含 0,如果不同,则包含 1。(x & -x) 是 x 的最低有效位,即第一位差异。