以
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