交换奇偶位

前言

今天碰到一个题挺有意思的
题目要求:写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换


刚看到这个题可能有些摸不着头脑,但只要思路清晰还是挺简单的

由于二进制中一个整数的二进制位的奇数位和偶数位的和等于这个数的大小

我们可以分别把该整数二进制位的奇数位和偶数位取出来,然后奇数位往左移动,偶数位往右移动,然后相加就能完成交换

而如何分别将奇数位和偶数位取出是很关键的一点

按位与的计算方法是:同为1才为1,否则为0

<forn color = red我们可以将这个数按位与上
0101 0101 0101 0101 0101 0101 0101 0101得到奇数位
此数的十六进制位为0x55555555

将这个数按位与上
1010 1010 1010 1010 1010 1010 1010 1010得到偶数位
此数的十六进制位为0xaaaaaaaa

#define change(n) (n= (n&0xaaaaaaaa>>1)+n&(0x55555555<<1))

我们来验证一下
我们以5为例
5的二进制位为 0 1 0 1
我们将奇偶位互换得到结果应该是 1 0 1 0 = 10

#define change(n) (n= (n&(0xaaaaaaaa)>>1)+n&(0x55555555<<1))

int main()
{
	int a = 5;
	change(a);
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值