【C语言】写一个宏可以将一个数的奇数位与偶数位进行交换

这道题我们用数字11来举个栗子。  它的二进制可以写为00000000 00000000 00000000 00001011

可以分为以下几步来解决:

①只保留奇数位,奇数位&1,偶数位&0

00000000 00000000 00000000 00001011&01010101 01010101 01010101 01010101

--->00000000 00000000 00000000 00000001即可


②只保留偶数位,偶数位&1,奇数位&0

00000000 00000000 00000000 00001011&10101010 10101010 10101010 10101010

--->00000000 00000000 00000000 00001010即可

③再将按位与运算之后的奇数位二进制列00000000 00000000 00000000 00000001向左移一位

④偶数位二进制列00000000 00000000 00000000 00001010向右移一位

⑤再将移动后的偶数位二进制列与奇数位二进制列进行或运算即可。

00000000 00000000 00000000 00001010  |  00000000 00000000 00000000 00000001

----->00000000 00000000 00000000 00000111

因为其他位为0,所以我们可以对比一下交换前后的后四位二进制 是 1011和0111,很明显,已经成功将偶数位与奇数位进行了交换。 

注:当然这里的与运算0101和1010要用二进制数列计算,但是在定义宏时可以写成十六进制0x55555555和0xaaaaaaaa

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>


#define SWAP(X) ((((X)&0x55555555)<<1)|(((X)&0xaaaaaaaa)>>1))

int main()
{
	int n = 0;
	int ret = 0;
	printf("请输入一个数>");
	scanf("%d",&n);
	ret = SWAP(n);
	printf("%d交换后为:%d\n",n, ret);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Miss_Monster/article/details/81180955
今日推荐