思路
前提:
以
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