如何交换前两个连续的不同位
How to swap first 2 consecutive different bits
在无符号整数中交换前两个(最低有效位)不同连续位的快速而优雅的方法是什么?
例如
100100 -> 100010
110011 -> 110101
到目前为止,我想出了这个:
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));
}
我对上述解决方案最大的不满是它使用了if
指令。
我会这样做:
unsigned long long my_swap(unsigned long long number)
{
unsigned long long x = number ^ (number >> 1);
return number ^ ((x & -x) * 3);
}
当数字==0时,我的解决方案返回0,而原始问题的函数返回110000000000000000000000000000000000000000000000000000000000000000000。
一些解释:如果这个位置的比特等于下一个比特,则x的比特包含0,如果不同,则包含1。(x&-x)是x的最低有效位,也就是说第一个位差。
在不使用if
的情况下,这是相同的想法。
unsigned long long special_swap(unsigned long long number)
{
unsigned long long t = ((number & 1) << 1) - 1;
return (number + t) ^ ((number ^ (number + t)) >> 2);
}
变量t
是1或-1,具体取决于数字的lsb。
实时测试
相关文章:
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 可以将两个相同类型的连续数组视为一个数组吗?
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 比较两个std::矢量/阵列,或者通常比较两个stl连续器
- 使用 C++ 读取具有两个连续分隔符的 csv 文件
- 为什么动态分配的两个变量的内存位置不是连续的?
- 子数组中两个数字的相同出现(连续)
- 如何比较C 列表中的两个连续元素
- 为什么两个执行矩阵乘法的过程并行运行比连续运行慢
- 如何生成没有两个相邻连续数字的排列
- 两个最大的连续子阵列
- 是否有任何方法可以比较C 中的STD ::的两个连续元素
- 为什么我不能在同一分配中保留两个连续的内存区域,而不通过单个调用保留这两个区域?
- 如何比较两个连续的迭代步骤?在C++
- 为什么两个连续的转换会改变一个整数
- 对于同一循环的这两个连续组,是否有更有效的解决方案
- Boost.SSpirit.x3避免将同一类型的两个连续属性塌陷为向量
- 如何检测两个连续的视频帧是否相同
- 在整数数据类型和连续两个字符类型之后.第 2 个字符的数据类型跳过..为什么
- 连续两个"cin"不起作用