写一个宏,可以将一个整数二进制奇数位和偶数位交换详解

何为一个整数二进制奇数位和偶数位

想要完成解题,我们首先要知道一个整数二进制奇数位和偶数位,具体代表着哪一位

对于一个32位的整型,它的下标是从 0 ~ 31 的,总共32位。

其中下表为0的位是最右边的位(即最低有效位,LSB)

而下标为31的位是最左边的位(即最高有效位,MSB)

当我们说 “偶数位” 的时候,我们指的是下标为偶数( 0 , 2 , 4 …… 30 )的位

当我们说 “奇数位” 的时候,我们指的是下标为奇数( 1 , 3 , 5 …… 31 )的位

步骤1:定义掩码

我们要把一个整数二进制奇数位和偶数位交换,首先想到的就是找掩码来进行操作

何为掩码?掩码通常是一个二进制数,用于选择和屏蔽特定的位

在交换一个整数二进制奇数位和偶数位问题中,掩码用来选则出整数中的奇数位和偶数位。具体我们要用到两个掩码:

1.1偶数位掩码:

一个掩码,其中偶数索引位(从右边数起,第一位开始)是1,其余为是0。对于一个32位整数,它通常是:0x55555555


0101 0101 0101 0101 0101 0101 0101 0101 0101 0101  //(二进制)5    5    5    5    5    5    5    5    5    5     //(十六进制)

偶数位掩码的作用就是将整数所有的偶数位保留下来( 0 , 2 , 4 …… 30 ),

而奇数位全部清零( 1 , 3 , 5 …… 31 ),具体我们可以使用:

按位与 (&)来操作

通过这样的操作,我们就将 所有的偶数位保留下来,而奇数位全部清零了

1.2奇数位掩码:

一个掩码,其中奇数位索引的位为1,其余是0对于一个32位整数,它通常是:0xAAAAAAAA

奇数位掩码的作用就是将整数所有的奇数位保留下来,而奇数位全部清零。

步骤2:位操作

接下来,我们使用位操作来交换奇数位和偶数位

  • 将整数与偶数位掩码0x55555555进行按位与操作(&),得到只包含偶数位信息的数。
  • 将这个只包含偶数位信息的数左移一位(<< 1),使原来的偶数位占据奇数位的位置。
  • 同时,将整数与奇数位掩码0xAAAAAAAA进行按位与操作(&),得到只包含奇数位信息的数。
  • 将这个只包含奇数位信息的数右移一位(>> 1),使原来奇数位占据偶数位的位置
     

步骤3:合并结果

最后,我们将左移后的偶数位和右移后的奇数位通过:

按位或操作( | ),或者加号( + )合并起来,得到最终交换了奇数位和偶数位的整数。

宏的最终实现

#define SWAPa(x) ( \(((x) & 0x55555555) << 1) | \(((x) & 0xAAAAAAAA) >> 1) \
)
#define SWAb(x) ( \(((x) & 0x55555555) << 1) + \(((x) & 0xAAAAAAAA) >> 1) \
)
int main() {printf("%d\n", SWAPa(5));printf("%d\n", SWAPa(5));printf("%d\n", SWAPa(10));printf("%d\n", SWAPa(10));return 0;
}

输出结果:10 10 5 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/600241.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

入门微调预训练Transformer模型

大家好&#xff0c;HuggingFace 为众多开源的自然语言处理&#xff08;NLP&#xff09;模型提供了强大的支持平台&#xff0c;让这些模型能够通过训练和微调来更好地服务于各种特定的应用场景。在大型语言模型&#xff08;LLM&#xff09;迅猛发展的今天&#xff0c;HuggingFac…

qt 打印日志

在 Qt Creator 中&#xff0c;将 QDebug、QInfo、QWarning、QCritical 和 QFatal 打印的日志输出到指定文件&#xff0c;需要设置 Qt 的消息处理机制。这通常涉及到安装一个自定义的消息处理器&#xff0c;该处理器将日志消息重定向到文件。以下是一个基本的步骤指南&#xff1…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-航班时间

#include<iostream> using namespace std;int getTime(){int h1, h2, m1, m2, s1, s2, d 0;//d一定初始化为0&#xff0c;以正确处理不跨天的情况 scanf("%d:%d:%d %d:%d:%d (%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);return d …

【JAVASE】带你了解面向对象三大特性之一(多态)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1.多态 1.1 多态的概念 多态的概念&#xff1a;通俗来说&#…

MySQL的基本查询

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容介绍了mysql的基本查询部分的知识&#xff0c;包括Crea…

WebAPI(一)之DOM操作元素属性和定时器

webAPI之DOM操作元素属性和定时器 介绍概念DOM 树DOM 节点document 获取DOM对象操作元素内容操作元素属性常用属性修改控制样式属性操作表单元素属性自定义属性 间歇函数今日单词 了解 DOM 的结构并掌握其基本的操作&#xff0c;体验 DOM 的在开发中的作用 知道 ECMAScript 与 …

大厂高频面试题复习JAVA学习笔记-JUC多线程及高并发(下)

目录 7 阻塞队列知道吗? 概念​编辑 synchronized和lock的区别 虚假唤醒情况 ​编辑​编辑 8 线程池用过吗?ThreadPoolExecutor谈谈你的理解? Callable接口 线程池 Executors工具类 线程池底层原理 线程池七大参数 七大参数 底层原理 9 线程池用过吗?生产上你如…

Cyber Weekly #1

赛博新闻 1、弱智吧竟成最佳中文AI训练数据&#xff1f;&#xff01;中科院等&#xff1a;8项测试第一&#xff0c;远超知乎豆瓣小红书 使用弱智吧数据训练的大模型&#xff0c;跑分超过百科、知乎、豆瓣、小红书等平台&#xff0c;甚至是研究团队精心挑选的数据集。弱智吧数…

基于单片机数码管20V电压表仿真设计

**单片机设计介绍&#xff0c;基于单片机数码管20V电压表仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机数码管20V电压表仿真设计的主要目的是通过单片机和数码管显示电路实现一个能够测量0到20V直流电压的电…

漏洞挖掘 | 两个src案例分享

案例一 - 存储型XSS 文前废话:某天正在刷着**社区的帖子,突然间评论区的一条评论引起了我的注意,类似于下面这样 其中字体是蓝色的&#xff0c;这种评论在html标签中代码格式是<a>这是文字</a>这样的链接个格式。 同时评论区XSS漏洞的高发区,想着可能会有操作点 …

嵌入式工程师为什么要时刻保持危机感?

昨天有个特训营的铁子&#xff0c;说白天上班&#xff0c;晚上学习&#xff0c;有点干不动了&#xff0c;让我给他打打鸡血。 我突然词穷了&#xff0c;灵感枯竭了&#xff0c;就让徐工来发挥。 徐工的鸡汤是&#xff1a; 为什么大多数都很平庸&#xff0c;是因为想要进步&…

头盔检测 | 基于Caffe-SSD目标检测算法实现的建筑工地头盔检测

项目应用场景 面向建筑工地头盔检测场景&#xff0c;使用深度学习 Caffe SSD 目标检测算法&#xff0c;基于 C 实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装 Caffe SSD(2) 执行训练 sh examples/Hardhat/SSD300/train_SSD300.sh (3) 部署算法 项目获取 h…