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

原创 2018年04月15日 10:23:03

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

正文:

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

    例:如果给你一个数 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;
}


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

我们知道交换两个数的方法,而这个问题说的是将一个数的奇数位和偶数位交换,并且用宏实现,所以这个问题的主要障碍不是写一个宏,而是怎样提取奇数和偶数,只有提取奇数位和偶数位,那么一切都好说。现在我来说一种...
  • jhcconan614
  • jhcconan614
  • 2016-11-11 22:19:50
  • 263

【C语言】写一个宏将一个数字的奇数位和偶数位交换

写一个宏可以将一个数字的奇数位和偶数位交换 思路:(实现:奇偶位交换) 1.进行位操作,位运算应该是标配,最好最简单的方法了。 2.实现交换,常见交换有数组赋值交换 地址交换 还有位直接操...
  • lizhidefengzi
  • lizhidefengzi
  • 2016-11-04 20:02:19
  • 1124

宏定义小程序(写一个宏可以将一个数字的奇数位和偶数位交换)

写一个宏可以将一个数字的奇数位和偶数位交换。 使用宏实现两个数中求较大值。...
  • Hanani_Jia
  • Hanani_Jia
  • 2017-12-09 13:27:29
  • 215

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

//} #include #include #define Swap(NUM)\ (((NUM & 0xaaaaaaaa) >> 1) + ((NUM & 0x55555555)
  • shine_zyd_way
  • shine_zyd_way
  • 2016-07-31 10:34:42
  • 274

如何用一个宏将一个数字的奇数位和偶数位交换

如何用一个宏将一个数字的奇数位和偶数位交换呢? 我们应该思考怎么得到一个数字(32个比特位)的奇数位和偶数位。再考虑如何交换得到的奇数位和偶数位...
  • baidu_37964071
  • baidu_37964071
  • 2017-05-01 21:03:09
  • 209

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

交换一个数的奇数和偶数位在C语言是很常见的问题。#include #define CHANGE(x)\ ((x&(0x55555555)) >1) //奇数位左移,偶数位右移int...
  • LALALAJIUJIU
  • LALALAJIUJIU
  • 2016-10-17 22:50:43
  • 214

用宏写一个函数可以将一个数字的奇数位和偶数位互换

#include #include #include #define EXCHANGE(a)\ ((a&(0x55555555))>1) int main() { int a = 0; ...
  • z517602658
  • z517602658
  • 2016-11-02 14:16:06
  • 197

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

写一个宏可以将一个数字的奇数位和偶数位交换 分别取出数字的所有奇数位和偶数位,将所有奇数位左移一位,所有偶数位右移一位,所得结果按位或即可 程序代码如下:...
  • ValDC_Morning
  • ValDC_Morning
  • 2016-12-11 14:04:01
  • 376

【C语言】写一个宏交换数字的奇数位与偶数位

问题描述:写一个宏可以将一个数字的奇数位和偶数位交换。思路:交换数字的奇偶位是学习C语言中比较常见的问题,最简单的方法就是将第0位与第1位交换,第2位与第3位……依此类推。#include #defi...
  • Monster_Girl
  • Monster_Girl
  • 2016-07-22 00:51:52
  • 1147

9.5位操作(六)——交换某个整数的奇数位和偶数位,使用指令越少越好

/**  * 功能:交换某个整数的奇数位和偶数位,使用指令越少越好(即,位0与位1交换,位2与位3交换,以此列推)。  */ /** * 思路:先操作奇数位,再操作偶数位。将数字n...
  • shangqing1123
  • shangqing1123
  • 2015-08-06 14:18:41
  • 547
收藏助手
不良信息举报
您举报文章:写一个宏将一个数的奇数位和偶数位交换
举报原因:
原因补充:

(最多只允许输入30个字)