写一个宏将一个数的奇数位和偶数位交换

题外话:大家一开始拿到这个题都会想到是将十进制数的奇偶数位进行交换,这边就需要大家多多思考一下了,揣摩一下出题者的想法,就会联想到我们需要将二进制数的奇数位和偶数位进行交换

正文:

    首先大家拿到这个题,要对宏函数有一个整体的认识,然后思考如何使用宏函数实现我们的功能呢?

    例:如果给你一个数 num = 5,其二进制位为(0101),交换后会变成(1010)

          这样按照题设写了之后就会发现,他是将第0位与第1为交换,第2位与第3位交换,以此类推

          我们就可以想到一个大体的思路:

               1、先将数num的奇数位和偶数位分别提取出来,分别提取的意思是如果提取奇数位,偶数位上的二进制数全为0,反之,提取偶数位,奇数位上的二进制数全为0;

               提取偶数位,要让奇数位为0,我们可以想到用一个奇数位为0偶数位为1的数与之做与运算就可以得到奇数位为0,偶           数位不变了。这个数就是——01010101010101010101010101010101(二进制表示),在代码中不易书写,所以             通常用十六进制表示0x55555555

              同理,提取奇数位,要让偶数位为0,我们用偶数位为0奇数位为1的数与之做与运算就可以让奇数位为0,偶数位不变

          了。这个数是——10101010101010101010101010101010(二进制表示)——0xAAAAAAAA(十六进制表示)

                2、然后将奇数位右移一位(就会移到偶数位上),偶数位左移一位(就会移到奇数位上)

                3、最后,移位后的两个二进制数再做或运算,就可以得到交换后的数字

代码实现为:

#include <stdio.h>
#include <stdlib.h>

#define swap(n) ((n&0x55555555)<<1)|((n&0xAAAAAAAA)>>1)

int main()
{
	int num = 0;
	printf("请输入一个数:>");
	scanf("%d", &num);
	int ret = swap(num);
	printf("二进制奇偶数位交换得到的数字为:%d", ret);
	system("pause");
	return 0;
}


阅读更多
个人分类: C语言
上一篇猜数字游戏
下一篇数组总结(一)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭