gpt4 book ai didi

c++ - 如何交换前 2 个连续的不同位

转载 作者:可可西里 更新时间:2023-11-01 17:50:20 24 4
gpt4 key购买 nike

交换无符号整数中前 2 个不同连续位的快速而优雅的方法是什么?

例如

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,而原始问题的函数返回 11000000000000000000000000000000000000000000000000000000000000000。

一些解释:x 的位如果这个位置的位与下一位相等则包含 0,如果不同则包含 1。 (x & -x)是x的最低位,也就是第一个位差。

关于c++ - 如何交换前 2 个连续的不同位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33532045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com