请添加图片描述

(目录)

题目要求

使用宏交换二进制的奇数位和偶数位


必备知识

在这里插入图片描述


==注意==

  • 如果想要保留一个比特位,将其它位舍弃

==方法:给要保留的比特位与上1,其它位与上0==

如:
1000 0011
现在只想保留最高位的1
->只需与上:1000 0000
  
    1000 0011
   &1000 0000
   -----------
    1000 0000  这样就实现了保留最高位的1,其它舍弃的效果

  • 如果想要某一个位变成1,其它位不变

==方法:给该位或上1,其他位或上0==


如:
1000 0011
现在只想保留最高位的1
->只需与上:1000 0000
  
    1000 0011
   &1000 0000
   -----------
    1000 0000  
    这样就实现了保留最高位的1,其它舍弃的效果

思路分析1

在这里插入图片描述

代码1

#include<stdio.h>
#define SWAP(n)  n = ((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1)
int main()
{
	int a = 10;
	//0000 1010
	//奇偶交换结果:0000 0101 ->5
	int b = 20;
	//0001 0100
	//奇偶交换结果:0010 1000 ->40
	printf("%d\n", SWAP(a));
	printf("%d\n", SWAP(b));
	return 0;
}

思路分析2

在这里插入图片描述


代码2

#include<stdio.h>
#define SWAP(n)  n = ((n&0x55555555)<<1) ^ ((n&0xaaaaaaaa)>>1)
int main()
{
	int a = 10;
	//0000 1010
	//奇偶交换结果:0000 0101 ->5
	int b = 20;
	//0001 0100
	//奇偶交换结果:0010 1000 ->40
	printf("%d\n", SWAP(a));
	printf("%d\n", SWAP(b));
	return 0;
}