1、写一个宏可以将一个数字的奇数位和偶数位交换。
刚看到这个题的时候感觉我也觉得这个题很怪,让交换一个数的奇数位和偶数位,感觉完全不知道该从何处下手,然后通过在网上查了一下才知道这个题要交换的不是十进制数,而是十进制对应的二进制数的奇数位和偶数位。代码如下:
#include <stdio.h>
#include <stdlib.h>
# define change(a) (((a)&0xAAAAAAAA)>>1)|(((a)&0x55555555)<<1)
int main()
{
int a = 0;
scanf ("%d",&a);
printf ("转换前:%d\n",a);
printf ("转换后:%d\n",change(a));
system ("pause");
return 0;
}
/*
5
转换前:5
转换后:10
请按任意键继续. . .
*/
其中0xAAAAAAAA 和 0x55555555都是十六进制数,对应的二进制分别是1010 1010 1010 1010 1010 1010 1010 1010 和 101 0101 0101 0101 0101 0101 0101 0101,a&0xAAAAAAAA可以得到a二进制中的偶数位,右移一位就把偶数位的数移到了奇数位上,右移时失去的以为是奇数位,所以没有影响;同理:a&0x55555555得到a的奇数位,左移一位就把奇数位移到偶数位上,左移一位时丢掉的一位是偶数位,所以也没有影响。最后再把得到的两个数组合在一起就可以了。下图是输入10,转换后变成5的大概过程:
2、用宏定义求最大值
#include <stdio.h>
#include <stdlib.h>
# define Max(a,b) (a)>(b)?(a):(b)
int main()
{
int a = 0, b = 0;
printf ("请输入一个数:\n");
scanf ("%d%d", &a, &b);
printf ("%d 和 %d 中最大是数是:%d\n",a, b, Max (a,b));
system ("pause");
return 0;
}
/*
运行结果:
请输入一个数:
10
20
10 和 20 中最大是数是:20
请按任意键继续. . .
*/