交换一个整数的二进制奇数位与偶数位

2023-04-27 21:26:01 浏览数 (1)

思路

前提:

int类型整数为例,假设一个int变量占四字节空间。 假设二进制数的最低位是奇数位。

假设一个整数的二进制形式为00000000 00000000 0000000 10100101,十进制形式是165。 那么交换之后的二进制形式为00000000 0000000 00000000 01011010,十进制形式是90

思路:

  1. 二进制数00000000 00000000 00000000 10100101的所有奇数位保持不变而偶数位变为0按位与上01010101 01010101 01010101 01010101,十六进制形式为0x55555555),得到二进制数00000000 0000000 00000000 00000101,再左移1个bit位,得到二进制数00000000 00000000 00000000 00001010
  2. 二进制数00000000 00000000 00000000 10100101的所有偶数位保持不变而奇数位变为0按位与上10101010 10101010 10101010 10101010,十六进制形式为0xaaaaaaaa),得到二进制数00000000 0000000 00000000 10100000,再右移1个bit位,得到二进制数00000000 00000000 00000000 01010000
  3. 最后两个二进制数00000000 00000000 00000000 0000101000000000 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

0 人点赞