题目名称 :写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
解题思路 :
随便给出一个32个bit位的二进制数字,观察发现,:
我们可以将其奇数位的二进制位都保留,然后偶数位制成0,再右移一位,这样奇数位就全部去到偶数位位置;
再将其偶数位保留,奇数位制成0,左移一位,这样全部偶数位就去到奇数位位置;
再将得到的两个数字相加,即可实现交换;
补充:
保留想要的位置方法:按位与上一个1,即可保留,不要的按位与一个0;
保留奇数位时按位与的1010换算成十六进制就是A
保留偶数位按位与的0101换算成十六进制是5;
代码如下:
#define SWAP_BIT(n) (n=((n&0xaaaaaaaa)>>1)+((n&0x55555555)<<1))
int main()
{
int a = 10;
//00000000000000000000000000001010 ->10
// 其奇偶位交换后得 :
//00000000000000000000000000000101 ->5
SWAP_BIT(a);
printf("a=%d\n", a);
return 0;
}