您的位置:首页 > 其它

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

2016-12-05 20:00 225 查看
宏函数实现一个数字二进制的奇数位和偶数位交换
宏函数在c语言编程中有不可忽视的作用,并且数字二进制的奇偶位交换也比较常见,所以用宏函数来实现数字二进制的奇数位和偶数位交换不失为一个很好的方法。

首先我们要清楚宏函数的用法,其次要有用宏函数实现该功能的整体思路,下面我带着大家分析一下:

:将数字5(0101)交换二进制奇偶位为(1010)即数字10。

就是将数字的二进制的第0位和第1位交换,第2位和第3位交换,后面以此类推。

首先我们需要将奇数位和偶数位提取出来,通过位操作运算符将两个合并成交换后的数字。

:设需要变换的数字为x,

将(x&(0x55555555))<<1; x按位与0x55555555后得到的二进制奇数位与x相同但偶数位均为0,然后再向左移一位,变成偶数位为原来的奇数位,且移动后奇数位全为0;

将(x&(0xAAAAAAAA))>>1; x按位与0xAAAAAAAA后得到的二进制偶数位与x相同但奇数位均为0,然后再向右移一位,变成奇数位为原来的偶数位,且移动后偶数位全为0;

最后将两个二进制按位或((x&(0x55555555))<<1) | ((x&(0xAAAAAAAA))>>1),便最终得到了交换后的数。

注意:这里用十六进制的数值进行按位与操作十分方便,不需要将原本的十进制转换,直接位操作便可修改二进制返回之后仍为十进制!



源代码:

#define MYSWAP(x) \
(((x&(0x55555555))<<1) | ((x&(0xAAAAAAAA))>>1))
//提取x的奇数位并左移一位     偶数位左移一位
#include<stdio.h>
int main()
{
int x = 5;
printf("交换后:%d\n", MYSWAP(x));
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: