服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C生万物C语言宏将整数二进制位的奇偶数位交换

C生万物C语言宏将整数二进制位的奇偶数位交换

2023-02-28 14:23Fire_Cloud_1 C/C++

这篇文章主要为大家介绍了C生万物C语言使用宏将整数二进制位的奇偶数位交换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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

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

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

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

  • 因为需要交换的是这个整数二进制位的【奇数位】和【偶数位】,因此我们要先获取到它们,这里要使用到一个很巧妙的手法,可以将这个数的奇偶位分别保存下来,就要用到在十六进制中很奇特的两个数——>==5 和 a== ;因为5写成二进制的形式为0101,1均在奇数位上。a写成二进制的形式为1010,1均在偶数位上
  • 对于一个数来说可以分为32个比特位,所以我们就需要8个5和8个a,将它们展开后就是0x555555550、0xaaaaaaaa;所以将这个整数与前者进行【&】运算便可以保留下它的奇数位;这个整数与后者进行【&】运算便可以保留下它的偶数位
  • 按位与的运算规则是==全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;
}
  • 首先的一点就是对于【宏】来说它和函数不一样是它不需要声明类型,也没有复杂的函数体,直接给出运算规则即可
  • 所以你可以看到,我写的这个宏就是我在上面所说的思路转化为的代码。不过很重要的一点是写宏的时候一定要加足括号,因为对于宏来说在预编译阶段就会直接进行替换,若是没有加括号的话可能会导致出现优先级的问题

来看看运行结果吧

C生万物C语言宏将整数二进制位的奇偶数位交换

2、算法图解分析

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

首先就是第一步,分别取出奇数位和偶数位

C生万物C语言宏将整数二进制位的奇偶数位交换

  • 然后进行移位操作,使奇变偶、偶变奇

C生万物C语言宏将整数二进制位的奇偶数位交换

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

C生万物C语言宏将整数二进制位的奇偶数位交换

可以看到最后的结果就是我们程序的执行结果【24】

 

总结与提炼

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

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

以上就是C生万物使用宏将整数二进制位的奇偶数位交换的详细内容,更多关于C 宏整数二进制奇偶数位交换的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7197790401494597689

延伸 · 阅读

精彩推荐
  • C/C++浅谈C++ 设计模式的基本原则

    浅谈C++ 设计模式的基本原则

    这篇文章主要介绍了++ 设计模式的基本原则,主要的目标是实现最终目的,高内聚,低耦合,开放封闭原则类的改动是通过增加代码进行的,感兴趣的小伙...

    小羊的Debug3642022-01-06
  • C/C++利用Matlab制作一款狗头翻牌子小游戏

    利用Matlab制作一款狗头翻牌子小游戏

    本文将用Matlab制作一个狗头翻牌子的小游戏,就是点击一个牌子时,该牌子和周围四个牌子也会相应发生变化,想办法让所有牌子都在同一面即为游戏胜利...

    slandarer4082022-10-11
  • C/C++C语言中的BYTE和char深入解析

    C语言中的BYTE和char深入解析

    在C语言中,字符(character)这个术语具有两个层次上的含义:书写源程序的字符和程序处理的字符...

    C语言教程网7032021-01-04
  • C/C++C++小知识:尽可能使用枚举类

    C++小知识:尽可能使用枚举类

    今天小编就为大家分享一篇关于C++小知识:尽可能使用枚举类,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    修语讲编程6452021-07-18
  • C/C++C++判断一个点是否在圆内的方法

    C++判断一个点是否在圆内的方法

    这篇文章主要为大家详细介绍了C++判断一个点是否在圆内的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Fizz_沫烨11402021-06-25
  • C/C++C++基于灰度图上色GrayToColorFromOther的实现

    C++基于灰度图上色GrayToColorFromOther的实现

    本文主要介绍了C++基于灰度图上色GrayToColorFromOther的实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧...

    翟天保Steven9162021-11-30
  • C/C++C++实现LeetCode(109.将有序链表转为二叉搜索树)

    C++实现LeetCode(109.将有序链表转为二叉搜索树)

    这篇文章主要介绍了C++实现LeetCode(109.将有序链表转为二叉搜索树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可...

    Grandyang10542021-12-02
  • C/C++C语言fgetc和fputc函数用法详解(以字符形式读写文件)

    C语言fgetc和fputc函数用法详解(以字符形式读写文件)

    这篇文章主要介绍了C语言fgetc和fputc函数用法详解(以字符形式读写文件),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价...

    C语言中文网8252021-10-19