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));
}

效果:

相关推荐
-快乐的程序员-3 分钟前
C++的md5函数
开发语言·c++
Huangjin007_10 分钟前
【C++ STL篇(九)】map容器——零基础入门与核心用法精讲
开发语言·c++·算法
qq_49244844611 分钟前
Jmeter Transaction Controller(事务控制器) 的 TPS(每秒事务数)严格固定为 1
java·开发语言·jmeter
2401_8582861114 分钟前
OS74.【Linux】线程互斥(3) 线程安全、重入
linux·运维·服务器·开发语言·线程
爱喝水的鱼丶15 分钟前
SAP-ABAP:数据类型与数据对象 第二篇:底层逻辑篇——数据类型的分类体系与底层存储原理
运维·开发语言·学习·sap·abap
肥胖小羊17 分钟前
基于状态机的客户生命周期流转与自动化触达引擎实现
开发语言·python
玄泽幻库19 分钟前
【主流版本】JDK安装版下载地址和环境配置方法
java·开发语言·jdk
西凉的悲伤20 分钟前
Java parallelStream并行流
java·开发语言·parallelstream·并行流
少司府24 分钟前
C++基础入门:深挖list的那些事
开发语言·数据结构·c++·容器·list·类型转换·类和对象
罗超驿29 分钟前
14.MySQL索引底层原理:从数据结构到B+树的深度解析
数据结构·b树·mysql