题目
用一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
如:01,是1,交换完是10,是2.
思路
1.分别取出奇数位上的数字和偶数位上的数字
举个例子:1001 0110 1001 0110
奇数位上的数字是 1001 0110 偶数位 1001 0110 ————————————————————————————————————————— 0001 0100 1000 0010
取出来的新二进制数只 保留奇数位或者偶数位上原数字,其余位用0替代。
- 我们知道,0或者1&1都等于他本身,就能保留对应位上的数字,
- 1&0=0,0&0=0,就可以用&0取代不保留位置上的数字.
2.用n&0101 0101取对应的奇数位,用n&1010 1010取对应的偶数位。
例子: 1001 0110 1001 0110
奇数位 & 0101 0101 偶数位 & 1010 1010
——————————————————————————————————————————
0001 0100 1000 0010
0101就可以用0x555555表示,1010就用0xaaaaa表示。
3.将奇数位上的数字左移动1位,偶数位上的数字右移动1位,完成奇偶位交换
继续上面的例子,0001 0100<<1;1000 0010>>1.
4.用运算符|合并到一起,形成新数字(交换完成)
1|0=1;0|0=0;0|1=1。
0010 1000
0100 0001 |
______________________________________________________
0110 1001
代码:
150是1001 0110
105是0110 1001
#define SWAPBIT(n) (((n)&0x55555555)<<1|((n)&0xaaaaaaaa)>>1)
#include<stdio.h>
int main()
{printf("%d", SWAPBIT(150));
}