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

本文通过举例说明如何使用C语言宏实现一个数的奇数位和偶数位的交换,详细解释了每一步的逻辑,包括与运算、位移和或运算的操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题我们用数字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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值