这道题我们用数字11来举个栗子。 它的二进制可以写为00000000 00000000 00000000 00001011
可以分为以下几步来解决:
①只保留奇数位,奇数位&1,偶数位&0
即00000000 00000000 00000000 00001011&01010101 01010101 01010101 01010101
--->00000000 00000000 00000000 00000001即可
②只保留偶数位,偶数位&1,奇数位&0
即00000000 00000000 00000000 00001011&10101010 10101010 10101010 10101010
--->00000000 00000000 00000000 00001010即可
③再将按位与运算之后的奇数位二进制列00000000 00000000 00000000 00000001向左移一位
④偶数位二进制列00000000 00000000 00000000 00001010向右移一位
⑤再将移动后的偶数位二进制列与奇数位二进制列进行或运算即可。
扫描二维码关注公众号,回复:
2747695 查看本文章
00000000 00000000 00000000 00001010 | 00000000 00000000 00000000 00000001
----->00000000 00000000 00000000 00000111
因为其他位为0,所以我们可以对比一下交换前后的后四位二进制 是 1011和0111,很明显,已经成功将偶数位与奇数位进行了交换。
注:当然这里的与运算0101和1010要用二进制数列计算,但是在定义宏时可以写成十六进制0x55555555和0xaaaaaaaa
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define SWAP(X) ((((X)&0x55555555)<<1)|(((X)&0xaaaaaaaa)>>1))
int main()
{
int n = 0;
int ret = 0;
printf("请输入一个数>");
scanf("%d",&n);
ret = SWAP(n);
printf("%d交换后为:%d\n",n, ret);
system("pause");
return 0;
}