例:11
11的二进制位为: 0000 0000 0000 0000 0000 0000 0000 1011
交换后: 0000 0000 0000 0000 0000 0000 0000 0111
思路:
可以先将11的奇数位保留下来,偶数位置为0:
0000 0000 0000 0000 0000 0000 0000 0001
进行交换,奇数位放到偶数位上
整体左移1
0000 0000 0000 0000 0000 0000 0000 0010
再将11的偶数位保留下来,奇数位置为0:
0000 0000 0000 0000 0000 0000 0000 1010
进行交换,偶数位放到奇数位上
整体右移1
0000 0000 0000 0000 0000 0000 0000 0101
最后进行组合(相加)
0000 0000 0000 0000 0000 0000 0000 0111
具体实现:
#define SWAP(a) (((a&0xaaaaaaaa )>> 1) + ((a&0x55555555) << 1))
int main()
{
printf("交换后的结果为%d\n",SWAP(11));
return 0;
}
运行结果
交换后的结果为7