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

来源:互联网 发布:php 两个日期相差天数 编辑:程序博客网 时间:2024/04/28 16:23

我们知道交换两个数的方法,而这个问题说的是将一个数的奇数位和偶数位交换,并且用宏实现,所以这个问题的主要障碍不是写一个宏,而是怎样提取奇数和偶数,只有提取奇数位和偶数位,那么一切都好说。现在我来说一种很神奇的方法,至少在我一筹莫展时看到后感觉很神奇。
其实说起来也没什么大不了的,就是将原数字 x 与01序列进行按位与运算,例如:13—->1101,要提取其奇数位,只需要将其与0x5555 5555(其实就是0101 0101……)按位与之后即可,同样的,要提取偶数位,只需将其与0xAAAA AAAA(其实是1010 1010……)按位与即可。
那么这个问题但这里就简单了,想要交换,只需将奇数位左移,偶数位右移一位,之后将得到的结果按位或即可。
下面我们来实现这个程序吧:

#include<stdio.h>#include<stdlib.h>#define CHANGE(x)  ((x & (0x55555555))<<1)|((x & (0xAAAAAAAA))>>1)int main(){    int x=0;    printf("Please Enter:");    scanf("%d",&x);    printf("%d\n",CHANGE(x));    system("pause");    return 0;}
1 0
原创粉丝点击