👑作者主页:@Fire_Cloud_1
🏠学习社区:烈火神盾
🔗专栏链接:万物之源——C
首先来说一下本题的实现思路🤔
位运算
十六进制
中很奇特的两个数——>5 和 a ;因为5写成二进制的形式为0101
,1均在奇数位上。a写成二进制的形式为1010
,1均在偶数位上0x555555550
、0xaaaaaaaa
;所以将这个整数与前者进行【&】运算便可以保留下它的奇数位;这个整数与后者进行【&】运算便可以保留下它的偶数位奇数位
来说,要将他们整体变为偶数位,就需要一个整体左移的操作,我们可以使用移位运算符<<
偶数位
来说,要将他们整体变为奇数位,就需要一个整体右移的操作,我们可以使用移位运算符>>
奇变偶
、偶变奇
也就相当于做了一次交换的操作,但是它们两个是一个独立的个体,并不完整,因此我们要将他们做一个拼接,这里我们使用到的又是另一个位运算符【|】按位或看完整体的思路之后,相信你对本题一定有了大致的方向,我们将上述的思路转化为代码
如果对宏定义不太清楚的可以看看这篇文章——> C生万物 | 详解程序环境和预处理
#define SWAP(n) num = (((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1))int main(void)
{int num = 36;int ret = SWAP(num);printf("num = %d\n", num);return 0;
}
来看看运行结果吧💻
再通过画图来分析一下,就看得更清楚了
奇变偶
、偶变奇
👉可以看到最后的结果就是我们程序的执行结果【24】
总结一下本文所学习到的内容