思路
前提:
以
int类型整数为例,假设一个int变量占四字节空间。 假设二进制数的最低位是奇数位。
假设一个整数的二进制形式为00000000 00000000 0000000 10100101,十进制形式是165。
那么交换之后的二进制形式为00000000 0000000 00000000 01011010,十进制形式是90。
思路:
- 二进制数
00000000 00000000 00000000 10100101的所有奇数位保持不变而偶数位变为0(按位与上01010101 01010101 01010101 01010101,十六进制形式为0x55555555),得到二进制数00000000 0000000 00000000 00000101,再左移1个bit位,得到二进制数00000000 00000000 00000000 00001010; - 二进制数
00000000 00000000 00000000 10100101的所有偶数位保持不变而奇数位变为0(按位与上10101010 10101010 10101010 10101010,十六进制形式为0xaaaaaaaa),得到二进制数00000000 0000000 00000000 10100000,再右移1个bit位,得到二进制数00000000 00000000 00000000 01010000; - 最后两个二进制数
00000000 00000000 00000000 00001010与00000000 00000000 00000000 01010000相加得到结果00000000 00000000 00000000 01011010,即十进制的90。
备注:
想要二进制数某一个
bit位保持不变而其他位变为0,只需要按位与上一个新的二进制数,而这个新的二进制数除了要保持不变的bit位是1,其他bit位都是0即可。 如11111111 11111111 11111111 11111111想要最低位保持不变,只需要按位与上00000000 00000000 00000000 00000001即可得到00000000 00000000 0000000 00000001
代码实现
代码语言:javascript复制#include <stdio.h>
int main() {
int n = 0;
scanf("%d", &n);
int z = ((n & 0x55555555) << 1) ((n & 0xaaaaaaaa) >> 1);
printf("%dn", z);
return 0;
}运行结果:

END


