写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换
我们知道任何一个数据在计算机中都可以用0和1表示,数字10在计算机中二进制表示为
00000000 00000000 00000000 00001010
现在我们要将该二进制数据中的奇数位和偶数位交换一下位置,我们假设右边第一个数字为奇数位,第二个为偶数位。则,交换以后就得到了下面的二进制数据
00000000 00000000 00000000 00000101
转换成十进制数就是5,那么我们怎样才能具体实现奇偶位的交换呐,下面继续看
1.设法把10的所有偶数位保留,奇数位上面的数设置为0
这里我们只需要将
10101010 10101010 10101010 10101010
00000000 00000000 00000000 00001010
按位与就可以保留偶数位,奇数位全部置为0,10101010 10101010 10101010 10101010转换成十六进制就是0xaaaaaaaa
2.设法把10的所有奇数位保留,偶数位设置为0
这里我们只需要将
01010101 01010101 01010101 01010101
00000000 00000000 00000000 00001010
按位与就可以保留奇数位,偶数位全部置为0,01010101 01010101 01010101 01010101转换成十六进制就是0x55555555
3.将1的二进制结果向右移动一位,将2的二进制结果向左移动一位,然后再把两个二进制数据加起来,这样就达到了题目要求的交换奇偶位的要求
00000000 00000000 00000000 00001010向右移动一位变成
00000000 00000000 00000000 00000101
00000000 00000000 00000000 00000000向左移动一位变成
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000101+
00000000 00000000 00000000 00000000=
00000000 00000000 00000000 00000101,该二进制数据转换成十进制数位5
好了上面就是真个算法的思路,下面看代码的实现过程
#include <stdio.h>
#define EXCHANGE(n) (((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1))
int main()
{
int input = 0;
while ((scanf("%d",&input)) != EOF)
{
printf("%d ", EXCHANGE(input));
putchar('\n');
}
return 0;
}
结果如下图