C++中实现无符号整数最低两个比特位交换的最快方法
交换无符号整数最低两个比特位的最快方案
实现代码
直接用无分支位运算实现,所有操作均为CPU原生支持的单周期指令,性能最优:
unsigned int x = 883621; // 仅需一行完成交换 x ^= (((x ^ (x >> 1)) & 1U) * 3U);
运行逻辑说明
我们需要交换的是整数的第0位(最低位)和第1位,两种情况处理逻辑完全统一,无需分支判断:
- 若两位值相同(同为0或同为1),交换后数值无变化,不需要做任何修改
- 若两位值不同,仅需同时翻转这两位,即可完成交换
逐段解释运算逻辑:
x ^ (x >> 1):把x右移1位后和原数做异或运算,如果最低两位不同,运算结果的第0位会是1,否则为0& 1U:提取出上述判断位,得到的结果只能是0或1* 3U:把判断位转换为掩码,1乘3得到二进制11,0乘3得到00,编译器会自动把乘3优化为(bit << 1) + bit,不会产生额外乘法开销- 最后和原数异或:掩码为
00时数值不变,掩码为11时翻转最低两位,刚好完成交换
效果验证
- 输入x=883621,二进制最低两位为
01:
判断位计算结果为1,掩码为11,异或后最低两位变为10,完全符合预期输出 - 输入x=7(二进制
0b111,最低两位为11):
判断位计算结果为0,掩码为00,数值保持7不变,符合补充要求
内容的提问来源于stack exchange,提问作者Mojtaba Valizadeh
相关产品推荐
相关产品推荐

