前言
今天碰到一个题挺有意思的
题目要求:写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换
刚看到这个题可能有些摸不着头脑,但只要思路清晰还是挺简单的
由于二进制中一个整数的二进制位的奇数位和偶数位的和等于这个数的大小
我们可以分别把该整数二进制位的奇数位和偶数位取出来,然后奇数位往左移动,偶数位往右移动,然后相加就能完成交换
而如何分别将奇数位和偶数位取出是很关键的一点
按位与的计算方法是:同为1才为1,否则为0
<forn color = red我们可以将这个数按位与上
0101 0101 0101 0101 0101 0101 0101 0101得到奇数位
此数的十六进制位为0x55555555
将这个数按位与上
1010 1010 1010 1010 1010 1010 1010 1010得到偶数位
此数的十六进制位为0xaaaaaaaa
#define change(n) (n= (n&0xaaaaaaaa>>1)+n&(0x55555555<<1))
我们来验证一下
我们以5为例
5的二进制位为 0 1 0 1
我们将奇偶位互换得到结果应该是 1 0 1 0 = 10
#define change(n) (n= (n&(0xaaaaaaaa)>>1)+n&(0x55555555<<1))
int main()
{
int a = 5;
change(a);
printf("%d\n", a);
return 0;
}