C语言使用宏_交换一个数的奇数位和偶数位 求两个数中的最大值

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
1020 中最大是数是:20
请按任意键继续. . .
*/

注意:使用宏时一般情况下不要在后面加分号,如果加了分号像这种:# define Max(a,b) (a)>(b)?(a):(b);,它会吧(a)>(b)?(a):(b);看成一个整体

猜你喜欢

转载自blog.csdn.net/a__b__c__/article/details/79865045