如何交换一个数字的奇数比特位和偶数比特位呢?
1.首先,要想办法得出奇数为和偶数位
由 与(&) 的特性可知:任何数 &1等于它本身,0&任何数都为0。
所以要得出奇数位 :给奇数位都&1,偶数位都&0
即 :num&0101 0101 0101 0101 0101 0101 0101 0101
得到它所有奇数位 num & 0x55555555
要得出偶数位 :给偶数位都&1,奇数位都&0
即 :num&1010 1010 1010 1010 1010 1010 1010 1010
得到它所有偶数位 num&0xaaaaaaaa
2.其次,将奇数位和偶数位互换
奇数位左移一位到偶数位 (num&0x55555555)<<1
偶数位右移一位到奇数位 (num&0xaaaaaaaa)>>1
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define CHANGE(num) ((((num) & 0xaaaaaaaa) >> 1) | (((num)& 0x55555555) << 1))
int main()
{
int num = 0;
scanf("%d",&num);
printf("%d\n",CHANGE(num));
return 0;
}
结果验证:输入 10 其二进制为(1010),
输出 5 其二进制为(0101)。