? ? ? ? ? ? ? ? ?用一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
如:01,是1,交换完是10,是2.
? ? ? ? ? ? ? ? ? ? ? 举个例子:1001 0110? ? ? ? ? ? ? ? ? ? ? ? ? 1001 0110
? ? ? ? 奇数位上的数字是? ?1001 0110? ? ? ? ? ???偶数位? ?1001 0110? ? ??—————————————————————————————————————————? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0001 0100? ? ? ? ? ? ? ? ? ? ? ? ? ?1000 0010
取出来的新二进制数只 保留奇数位或者偶数位上原数字,其余位用0替代。
例子:? ? ? ? ? ? ? ? ? ? ? ? ?1001 0110? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1001 0110
? ? ? ? 奇数位? ? &? ? ? ? ? 0101 0101? ? ? ? ? ? ? 偶数位? ?&? ? 1010 1010? ? ? ? ? ? ? ???
——————————————————————————————————————————
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0001 0100? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1000 0010
0101就可以用0x555555表示,1010就用0xaaaaa表示。
继续上面的例子,0001 0100<<1;1000 0010>>1.
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));
}