我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

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

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

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】

?总结与提炼

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

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录