用一行代码(宏)交换一个二进制整数的奇数位和偶数位

文章介绍了如何使用C语言的宏定义,通过位运算技巧来交换一个二进制整数的奇数位和偶数位。关键在于利用0x55555555和0xAAAAAAAA这两个掩码分别提取奇偶位,然后进行位移操作,最后通过按位或合并结果。这种方法展示了位操作在处理二进制数据时的高效性。
摘要由CSDN通过智能技术生成

用一行代码(宏)交换一个二进制整数的奇数位和偶数位

默认二进制数的最低为为奇数位

如果对位运算还不太熟悉,建议先看看👉传送门

·我们以一个例子来分析,例如:

对于二进制数0111 0100 1101 0101

我们交换奇偶位后就变成了:

我们发现,相较于交换前,交换后奇数位整体向左移动了一个单位,偶数位整体向右移动了一个单位

因此,我们只需要将这个数的奇数位和偶数位都提取出来,然后再分别对其进行移动,最后再合并就可以了

  • 要提取奇数位,就需要将每一个奇数位和1进行按位与操作,而数字5的二进制0101刚好符合每一个二进制位为1的特点,因此要提取奇数位,我们可以这么写:
num & 0x55555555
  • 同理,要提取偶数位,就需要一个数字的二进制偶数位都为1,而数字10的二进制1010刚好符合
num & 0xAAAAAAAA
  • 将奇数位向左移动一位,偶数位向右移动一位,最后再按位或,就可以实现交换二进制整数的奇偶位了

实现代码:

#define EXCHANGE(num) ((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << 1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Forward♞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值