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