要求:使用宏将一个数字的奇数位和偶数位进行交换
代码如下:
#include<stdio.h> #include<stdlib.h> #define CHANGE(I) (((I)&(0x55555555))<<1)|(((I)&(0xAAAAAAAA))>>1) int main() { int i = 0; printf("请输入一个整数:"); scanf("%d",&i); printf("交换奇偶数位之后:%d\n",CHANGE(i)); system("pause"); return 0; }
注意:
5=0101(5的二进制四位表示),用8个5的32位序列表示奇数位,奇数位左移就到了偶数位;同理A=10=1010(10的二进制四位表示),用8个A的32位序列表示偶数位,偶数位右移就到了奇数位。
00000000 00000000 00000000 00001010
&
01010101 01010101 01010101 01010101
——————————————————————
00000000 00000000 00000000 00000000
左移后: 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00001010
&
10101010 10101010 10101010 10101010
——————————————————————
00000000 00000000 00000000 00001010
右移后: 00000000 00000000 00000000 00000101
左移后: 00000000 00000000 00000000 00000101
|
右移后: 00000000 00000000 00000000 00000000
——————————————————————————
00000000 00000000 00000000 00000101 //5
运行结果为: