1.思路:
以10为例,它的二进制是00000000000000000000000000001010,,分别交换奇偶位。
(1).将奇数位保留,偶数位全部变为0,结果为00000000000000000000000000000000
(2).将偶数位保留,奇数位全部变为0,结果为00000000000000000000000000001010
(3).将(1)左移一位,得到0000000000000000000000000000000
将(2)右移一位,得到00000000000000000000000000000101
(4).将左移右移的结果相加起来,得到的就是奇偶位数交换后的结果,即00000000000000000000000000001010
2:本质上:
(1)的奇位数保留,偶位数为0,只需要按位与(&)上01010101010101010101010101010101(转为16进制是0x555555)
(2)的偶位数保留,奇位数为0,只需要按位与(&)上10101010101010101010101010101010(转为16进制是0xaaaaaaaa)
代码如下:
#define SWAP_WEI(n) n=(((n&0xaaaaaaaa)>>1)+((n&0x55555555)<<1))
int main()
{
int n = 0;
scanf("%d", &n);
SWAP_WEI(n);
printf("%d\n", n);
return 0;
}
测试结果如下: