题目要求
使用宏交换二进制的奇数位和偶数位
必备知识
注意
- 如果想要保留一个比特位,将其它位舍弃
方法:给要保留的比特位与上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; }