以
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
#include <stdio.h>
int main() {
int n = 0;
scanf("%d", &n);
int z = ((n & 0x55555555) << 1) + ((n & 0xaaaaaaaa) >> 1);
printf("%d\n", z);
return 0;
}运行结果:

END