用宏实现交换一个整数二进制中奇偶位的交换

写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换

我们知道任何一个数据在计算机中都可以用0和1表示,数字10在计算机中二进制表示为

00000000 00000000 00000000 00001010

现在我们要将该二进制数据中的奇数位和偶数位交换一下位置,我们假设右边第一个数字为奇数位,第二个为偶数位。则,交换以后就得到了下面的二进制数据

00000000 00000000 00000000 00000101

转换成十进制数就是5,那么我们怎样才能具体实现奇偶位的交换呐,下面继续看

1.设法把10的所有偶数位保留,奇数位上面的数设置为0

这里我们只需要将

10101010 10101010 10101010 10101010

00000000 00000000 00000000 00001010

按位与就可以保留偶数位,奇数位全部置为0,10101010 10101010 10101010 10101010转换成十六进制就是0xaaaaaaaa

2.设法把10的所有奇数位保留,偶数位设置为0

这里我们只需要将

01010101 01010101 01010101 01010101

00000000 00000000 00000000 00001010

按位与就可以保留奇数位,偶数位全部置为0,01010101 01010101 01010101 01010101转换成十六进制就是0x55555555

3.将1的二进制结果向右移动一位,将2的二进制结果向左移动一位,然后再把两个二进制数据加起来,这样就达到了题目要求的交换奇偶位的要求

00000000 00000000 00000000 00001010向右移动一位变成

00000000 00000000 00000000 00000101

00000000 00000000 00000000 00000000向左移动一位变成

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000101+

00000000 00000000 00000000 00000000=

00000000 00000000 00000000 00000101,该二进制数据转换成十进制数位5

好了上面就是真个算法的思路,下面看代码的实现过程

#include <stdio.h>
#define EXCHANGE(n) (((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1))
int main()
{
	int input = 0;
	while ((scanf("%d",&input)) != EOF)
	{
		printf("%d  ", EXCHANGE(input));
		putchar('\n');
	}
	return 0;
}

结果如下图

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼吐泡泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值