宏函数在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),便最终得到了交换后的数。
注意:这里用十六进制的数值进行按位与操作十分方便,不需要将原本的十进制转换,直接位操作便可修改二进制返回之后仍为十进制!
代码如下:
#include<stdio.h>
#include<windows.h>
#define CHANGE(X) ((((X) & (0x55555555)) << 1) | (((X) & (0xAAAAAAAA)) >> 1))
int main()
{
int x = 10;
printf("%d\n", CHANGE(x));
system("pause");
return 0;
}