c语言:用一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

题目

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

如:01,是1,交换完是10,是2.


思路

1.分别取出奇数位上的数字和偶数位上的数字

举个例子:1001 0110 1001 0110

奇数位上的数字是 1001 0110 偶数位 1001 0110 --------------------------------------------------------------------------------------------------------------------------- 0001 0100 1000 0010

取出来的新二进制数只 保留奇数位或者偶数位上原数字,其余位用0替代。

  • 我们知道,0或者1&1都等于他本身,就能保留对应位上的数字,
  • 1&0=0,0&0=0,就可以用&0取代不保留位置上的数字.

2.用n&0101 0101取对应的奇数位,用n&1010 1010取对应的偶数位。

例子: 1001 0110 1001 0110

奇数位 & 0101 0101 偶数位 & 1010 1010

------------------------------------------------------------------------------------------------------------------------------

0001 0100 1000 0010

0101就可以用0x555555表示,1010就用0xaaaaa表示。


3.将奇数位上的数字左移动1位,偶数位上的数字右移动1位,完成奇偶位交换

继续上面的例子,0001 0100<<1;1000 0010>>1.

4.用运算符|合并到一起,形成新数字(交换完成)

1|0=1;0|0=0;0|1=1。

0010 1000

0100 0001 |

______________________________________________________

0110 1001


代码:

150是1001 0110

105是0110 1001

cpp 复制代码
#define SWAPBIT(n) (((n)&0x55555555)<<1|((n)&0xaaaaaaaa)>>1)
#include<stdio.h>
int main()
{
	printf("%d", SWAPBIT(150));
}

效果:

相关推荐
luj_176813 分钟前
桥牌思维启示:系统设计的模块化架构
c语言·开发语言·c++·经验分享·算法
caimouse2 小时前
ReactOS 图形系统分析(16):字符串对象 — STROBJ(string.c)
c语言·开发语言
Aphelios3802 小时前
一次锁内网络IO引发的Tomcat线程池“饿死”事故
java·开发语言·spring boot·elasticsearch·tomcat·网络io阻塞·线程池耗尽
不可求~2 小时前
C++ std::string_view 不是字符串:从悬空引用到安全用法
java·开发语言·c++
en.en..3 小时前
数据结构考点解析:逻辑闭环与存储循环辨析
数据结构
90后小陈老师3 小时前
PHP 配置默认值失效排查实录:isset 兜底遇上表单空串回填,首页文案是怎么集体消失的
开发语言·php
JJJennie7774 小时前
Gemini 3.7 Flash 上线,Google 想让 AI 多干活
开发语言·javascript·ecmascript
wuyk5555 小时前
Python 第三章:列表 List
服务器·开发语言·python
Evand J5 小时前
【MATLAB例程,车联网7】CACC网联车辆协同控制:ACC对比、V2X时延丢包与队列稳定性,附例程下载链接
开发语言·matlab·车联网