思路分析
通过宏定义来实现二进制数的奇偶位交换,如果一个个遍历交换的话,那得算到猴年马月,这是我在网上看到的一个思路:
我们将每一位(整数在计算机里存储是4字节,32位)二进制数的奇数位保留,偶数位置为0,并向右移一位,这样就实现奇数位换到偶数位。同样的道理,再将偶数位保留,奇数位置为0,并左移一位实现偶数位到奇数位的交换。
最后将得到的两个数加起来,神奇的事情出现了:完成了交换(作者本人实现时震惊了一下,太巧妙了)。
步骤解析
1.将奇数位保留,可以利用与的思想(同1为1,有0为0),将奇数位每一位与1就保留了奇数位的值,与的值奇数位为1,偶数为置为0,0101(5),需要32位,转换为16进制就是0x55555555.再左移1位完成交换
2.偶数位就与1010(10),16进制为0xaaaaaaaa。再右移一位完成交换
3.最后再相加起来,就是我们需要的值。
代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS 1
#define change(n) (n=((n&0xaaaaaaaa)>>1) ((n&0x55555555)<<1))
#include<stdio.h>
int main()
{
int a = 10;
change(a);
printf("%d", a);
return 0;
}