C生万物 | 使用宏将一个整数的二进制位的奇数位和偶数位交换

news2024/10/6 4:03:36

在这里插入图片描述

👑作者主页:@Fire_Cloud_1
🏠学习社区:烈火神盾
🔗专栏链接:万物之源——C

淋漓尽致——位运算

  • ✒题目分析 && 实现思路[位运算]
    • 1、获取这个整数的奇数位和偶数位
    • 2、使用移位运算使【奇变偶】【偶变奇】
    • 3、合并奇数位和偶数位
  • ⌨代码分析
    • 1、代码展示
    • 2、算法图解分析
  • 📰总结与提炼

✒题目分析 && 实现思路[位运算]

首先来说一下本题的实现思路🤔

  • 本题不仅是要使用宏来是实现,而且还要对一个数的二进制位进行操作,所以我们就可以想到位运算

1、获取这个整数的奇数位和偶数位

  • 因为需要交换的是这个整数二进制位的【奇数位】和【偶数位】,因此我们要先获取到它们,这里要使用到一个很巧妙的手法,可以将这个数的奇偶位分别保存下来,就要用到在十六进制中很奇特的两个数——>5 和 a ;因为5写成二进制的形式为0101,1均在奇数位上。a写成二进制的形式为1010,1均在偶数位上
  • 对于一个数来说可以分为32个比特位,所以我们就需要8个5和8个a,将它们展开后就是0x5555555500xaaaaaaaa;所以将这个整数与前者进行【&】运算便可以保留下它的奇数位;这个整数与后者进行【&】运算便可以保留下它的偶数位
  • 按位与的运算规则是全1才为1,有0即为0

2、使用移位运算使【奇变偶】【偶变奇】

  • 在我们获取到奇数位和偶数位之后,就完成了第一步。接着去我们就可以将去交换奇数位和偶数位了,但是直接做整体的交换太麻烦了,也很难做到。既然在上一步中分别保留了奇数位和偶数位,那不妨分别对他们进行操作。
  • 对于奇数位来说,要将他们整体变为偶数位,就需要一个整体左移的操作,我们可以使用移位运算符<<
  • 对于偶数位来说,要将他们整体变为奇数位,就需要一个整体右移的操作,我们可以使用移位运算符>>
  • 移位运算的运算规则是左移表示÷2,右移表示×2

3、合并奇数位和偶数位

  • 进行移位操作之后,奇变偶偶变奇也就相当于做了一次交换的操作,但是它们两个是一个独立的个体,并不完整,因此我们要将他们做一个拼接,这里我们使用到的又是另一个位运算符【|】按位或
  • 按位或的运算规则是只要有1即为1,全0才位0

⌨代码分析

1、代码展示

看完整体的思路之后,相信你对本题一定有了大致的方向,我们将上述的思路转化为代码
如果对宏定义不太清楚的可以看看这篇文章——> 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;
}
  • 首先的一点就是对于【宏】来说它和函数不一样是它不需要声明类型,也没有复杂的函数体,直接给出运算规则即可
  • 所以你可以看到,我写的这个宏就是我在上面所说的思路转化为的代码。不过很重要的一点是写宏的时候一定要加足括号,因为对于宏来说在预编译阶段就会直接进行替换,若是没有加括号的话可能会导致出现优先级的问题

来看看运行结果吧💻

在这里插入图片描述

2、算法图解分析

再通过画图来分析一下,就看得更清楚了

  • 首先就是第一步,分别取出奇数位和偶数位
    在这里插入图片描述
  • 然后进行移位操作,使奇变偶偶变奇

在这里插入图片描述

  • 最后再将32为的奇偶分列进行一个合并

在这里插入图片描述
👉可以看到最后的结果就是我们程序的执行结果【24】

📰总结与提炼

总结一下本文所学习到的内容

  • 本篇文章虽然讲解的内容并不多,但是攻克了一道难题,虽然宏的代码看起来比较简洁,但是要想到还是需要一些时间的。如果我们在写程序的时候能够巧妙地运用宏去进行解决,就能事半而功倍
  • 特此分享思路,记录这一瞬间( •̀ ω •́ )y

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何通过限流算法防止系统过载

限流算法&#xff0c;顾名思义&#xff0c;就是指对流量进行控制的算法&#xff0c;因此也常被称为流控算法。 我们在日常生活中&#xff0c;就有很多限流的例子&#xff0c;比如地铁站在早高峰的时候&#xff0c;会利用围栏让乘客们有序排队&#xff0c;限制队伍行进的速度&am…

扫雷——“C”

各位uu们我又来啦&#xff0c;今天&#xff0c;小雅兰给大家介绍的又是一个小游戏&#xff0c;就是扫雷这款游戏&#xff0c;这个游戏和我昨天给大家介绍的三子棋游戏有异曲同工之妙&#xff0c;相信很多人都玩过&#xff0c;话不多说&#xff0c;我们进入正题吧. 《扫雷》是一…

【学习笔记】【Pytorch】十七、模型测试套路

【学习笔记】【Pytorch】十七、模型测试套路一、内容概述二、模型测试套路代码实现一、内容概述 利用已经训练好的模型&#xff0c;然后给它提供输入&#xff0c;判断输出是否正确&#xff0c;即模型的应用测试。 在模型测试也会有一些坑&#xff1a; 神经网络的输入一般是4…

【错误记录】Kotlin 代码编译时报错 ( Variable ‘name‘ must be initialized | 初始化块定义在所有属性之后 )

文章目录一、报错信息二、问题分析三、解决方案 ( 初始化块定义在所有属性之后 )一、报错信息 在 Kotlin 中 , init 初始化块 要 定义在所有成员属性之后 ; 如果在 init 初始化块 中 , 使用到了 成员属性 , 有可能出现 编译时报错信息 ; 报错代码示例 : class Hello{init {va…

seata安装及配置

1.下载 下载地址&#xff1a;https://github.com/seata/seata/tags 本文选用seata-1.4.2版 2.解压 tar -zxvf seata-server-1.4.2.tar.gz 3. 初始化数据库 登录mysql&#xff0c;然后创建数据库和数据表&#xff1a; -- -------------------------------- The script used…

【Java】【系列篇】【Spring源码解析】【三】【体系】【Environment体系】

整体结构图 本篇文章仅作简单了解&#xff0c;详细还等到Springboot系列里面详解PropertyResolver 作用 用于针对任何基础源解析属性(Property)的接口 方法解析 // 查看规定指定的key是否有对应的value 对应key的值是null的话也算是不能解析 boolean containsProperty(Stri…

持续丰富营销玩法 东风标致408X引领品牌向上焕新

1月5日&#xff0c;东风标致408X首秀——XSHOW开演&#xff0c;标致全球战略车型408X正式在中国亮相&#xff0c;定位为“新法式无界座驾”&#xff0c;它是东风标致全面向电动化、智能化、网联化的发展的一款汽车&#xff0c;也是引领东风标致向上焕新的一款全新车型。作为东风…

十五天学会Autodesk Inventor,看完这一系列就够了(终章),答疑

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

python SciPy 优化器

SciPy 优化器SciPy 的 optimize 模块提供了常用的最优化算法函数实现&#xff0c;我们可以直接调用这些函数完成我们的优化问题&#xff0c;比如查找函数的最小值或方程的根等。NumPy 能够找到多项式和线性方程的根&#xff0c;但它无法找到非线性方程的根&#xff0c;如下所示…

工具类库 Hutool介绍与使用(请记得收藏)

工具类库 Hutool介绍 Hutool是一个小而全的Java工具类库&#xff0c;通过静态方法封装&#xff0c;降低相关API的学习成本&#xff0c;提高工作效率&#xff0c;使Java拥有函数式语言般的优雅&#xff0c;让Java语言也可以“甜甜的”。Hutool中的工具方法来自于每个用户的精雕…

VMware vCenter上用OVF模板部署虚拟机

前言 在我们项目操作过程中&#xff0c;使用VMware vCenter系统&#xff0c;经常会出现使用原有部署环境来部署虚拟机&#xff0c;供项目组使用&#xff0c;此时我们克隆虚拟机就要用到OVF模板来克隆操作&#xff0c;这是一个非常实用的功能。 一、打开Vcenter&#xff0c;选定…

Redis学习笔记2_数据结构

Redis数据结构Redis数据结构二、数据结构2.1Redis核心对象2.2底层数据结构2.2.1 SDS-simple dynamic stringsds内存布局sds的操作为什么使用SDS&#xff0c;SDS的优势&#xff1f;2.2.2 listlist内存布局2.2.3 dictdict内存布局2.2.4 zskiplistzskiplist内存布局2.2.5 intsetin…

前端实现登录拼图验证

前言 不知各位朋友现在在 web 端进行登录的时候有没有注意一个变化&#xff0c;以前登录的时候是直接账号密码通过就可以直接登录&#xff0c;再后来图形验证码&#xff0c;数字结果运算验证&#xff0c;到现在的拼图验证。这一系列的转变都是为了防止机器操作&#xff0c;但对…

Python 第六章 函数

6.1函数的定义和调用6.1.1定义函数格式&#xff1a;def 函数名 ([参数列表]):["""文档字符串"""]函数体[return 语句]6.1.2函数调用格式&#xff1a;函数名([参数列表])python中函数可以嵌套定义例如&#xff1a;def add_modify(a,b):resultabpr…

Vue3响应式原理解析

前言 今年上半年开始&#xff0c;自己开始在新项目中使用 Vue3 进行开发&#xff0c;相比较于 Vue2 来说&#xff0c;最大的变化就是 composition Api 代替了之前的 options Api&#xff0c;更像是 React Hooks 函数式组件的编程方式。 Vue3相对于Vue2响应式原理也发生了变化…

vue日期组件el-date-picker中更改默认日期格式并且实时显示的方法

在项目中有一个需求是这样的,要求实时显示他的当前默认时间,并且不能修改 使用了默认:default-value"currentTime"属性之后,新增的时候会报错,前端与后端传递的数据不匹配 因为默认时间被new date() 解析之后返回的数据是默认时间形式的,格式不符 方法如下: 第一步&a…

Elasticsearch入门 - Mac上Elasticsearch和Kibana的安装运行与简单使用

文章目录一&#xff0c;Mac上Elasticsearch和Kibana的安装1.1 环境与下载1.2 安装与运行1.3 问题1.3.1 elasticsearch安装后其他机器不能访问1.3.2 kibana安装后其他机器不能访问二&#xff0c;Elasticsearch在Kibana的常见命令2.1 查看集群的健康状态2.2 索引2.2.1 查看所有索…

Scrum 敏捷开发

什么是敏捷开发 敏捷 开发是一个术语&#xff0c;用于描述迭代软件开发。 迭代软件开发通过在短增量完成工作&#xff08;通常称为 冲刺&#xff0c; Sprint&#xff09;来缩短 DevOps 生命周期。 冲刺通常长达一到四周。 敏捷开发通常与传统或瀑布式开发形成鲜明对比&#xff…

Vue基础9之脚手架的使用、ref属性、props配置项和mixin混入

Vue基础9使用Vue脚手架初始化脚手架说明具体步骤项目文件介绍将前面写好的单文件组件放入这里运行脚手架文件结构render的作用修改默认配置配置项ref属性props配置项简单的传值方法默认的字符串传值使用v-bind对数字类型进行传值限制数据类型接收数据时候只对数据类型进行限制接…

Java 搜索二维矩阵 II

搜索二维矩阵 II中等编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a;每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例 1&#xff1a;输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22]…