专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

几种典型宏程序的编写方法

来源:小易整编  作者:小易  发布时间:2023-09-05 08:57
摘要:宏是程序设计语言一个重要的内容,对于一些步骤少却又使用频繁的操作,考虑到程序容量和执行效率的问题我们一般不将其封装为函数而是以宏的形式出现。对于单片机程序这一点尤为突出。宏语言分类非常广泛,这里介绍C语言常用的一些宏的编写方法。二进制数宏...

宏是程序设计语言一个重要的内容,对于一些步骤少却又使用频繁的操作,考虑到程序容量和执行效率的问题我们一般不将其封装为函数而是以宏的形式出现。对于单片机程序这一点尤为突出。宏语言分类非常广泛,这里介绍C语言常用的一些宏的编写方法。

几种典型宏程序的编写方法

二进制数宏 01

利用二进制宏可以解决C语言不能直接使用二进制量的问题,宏核心代码如下: #define LONG_TO_BIN(n) \ ( \ ((n >> 21) & 0x80) | \ ((n >> 18) & 0x40) | \ ((n >> 15) & 0x20) | \ ((n >> 12) & 0x10) | \ ((n >> 9) & 0x08) | \ ((n >> 6) & 0x04) | \ ((n >> 3) & 0x02) | \ ((n ) & 0x01) \ ) #define BIN(n) LONG_TO_BIN(0x##n##L) 我们可以直接使用BIN(11100111)这种形式来使用常量,这就是最直观的二进制形式,非常方便,下载我们新建工程,测试代码如图:

02

由数制转换基本知识可知 二进制11000111对应十进制的199,我们使用BIN(11000111)与使用199具有同样的效果,程序运行结果验证了这一点。

位清除和设置宏 01

对于位操作,C语言提供了位域,但是位域要结合结构体使用,而由于C语言对字节对齐的方式未给出严格定义,不同编译器对于结构体的内存布局会有不同的实现方式,这就导致位域存在兼容性问题。我们可以使用位清除和未设置宏来解决这一问题: #define SET_BIT(var,BIT_POS) {var |= (0x01 << ((BIT_POS) % 8));} #define CLR_BIT(var,BIT_POS) {var &= (~(0x01 << ((BIT_POS) % 8)));} 其中SET_BIT(var, BIT_POS)为位设置宏,即设置变量var的第BIT_POS位为1,其中BIT_POS由0到该变量的最长长度 - 1,比如对于8位变量它的取值就是0~7。CLR_BIT(var, BIT_POS)与之类似,只不过CLR_BIT是将对应的位清零。 通过测试可以更好地理解,图为测试代码具体实现:

02

图为程序的运行结果,a最开始是0,而运行SET_BIT(a, 0)后变成了1,也就是a的最低位被SET_BIT置位了,而接着运行CLR_BIT(a, 0)后,a又变成0了,这也就是a的最低位被CLR_BIT清零了。

避免容量浪费的位编辑宏 01

前面介绍的位设置和位清除宏,可以实现变量的位操作,但是对于SET_BIT(var, BIT_POS)如果将BIT_POS传入变量,那么编译器会产生多余的代码造成空间浪费,这里再介绍一种避免这种问题的位编辑宏,分别为SET_BITn()和CLR_BITn(),分别对给定的变量的指定位置位和清零。具体实现如下: #define BIT0_SEL 0x01 #define BIT1_SEL 0x02 #define BIT2_SEL 0x04 #define BIT3_SEL 0x08 #define BIT4_SEL 0x10 #define BIT5_SEL 0x20 #define BIT6_SEL 0x40 #define BIT7_SEL 0x80 #define SET_BITn(var,BITn_SEL) {var |= (BITn_SEL);} #define CLR_BITn(var,BITn_SEL) {var &= (~(BITn_SEL));} 图中位该宏的测试代码:

02

图为程序的运行结果,初始状态a为0, 当我们执行SET_BITn(a, BIT0_SEL);后a的值变成了1,即a的最低位被SET_BITn置位了,接下来我们执行CLR_BITn(a, BIT0_SEL),这是a的值变成0了,这是说a的最低位被CLR_BITn清零了。这验证了我们宏程序的准确性。

计算两个数字差的绝对值 01

有时候我们需要获得两个量的差距,这个其实可以通过判断语句来实现,不过这样看起来显的代码有点臃肿了,比如,将变量a和b差的绝对值赋值给c我们可以这样做: if(a > b) { c = a - b; } else { c = b - a; } 很简单的一个功能,但却占用了8行,感觉有点多了,不如试试下面的宏程序: #define ABS(NUM1,NUM2) ((NUM1) > (NUM2) ? (NUM1 - NUM2):(NUM2 - NUM1)) 这样便可以写作: c = ABS(a, b); 而且你还可以倒过来这样写: c = ABS(b, a); 仅仅才一行,程序看起来是不是感觉清爽多了? 图中给出一个测试代码,帮助进一步理解这个宏程序:

02

图中为ABS测试程序的运行结果,可以看出当a = 0, b = 10时a和b之间差10各数,与程序运行结果一致。而当a = 10, b = 10时,它们之间差0各数,程序执行ABS(a,b)后结果为0,也是一致的。最后当a = 11, b = 10,即a和b之间差1个数,程序执行ABS(a, b)后结果也是1.


本文地址:网络知识频道 https://www.hkm168.com/jiqiao/1050705.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


网络知识
小编:小易整编
相关文章相关阅读
  • 有没有录制电脑屏幕的方法

    有没有录制电脑屏幕的方法

    电脑屏幕有录制的方法吗有两个方法一是用win10电脑自带的录屏软件来录,打游戏的时候按一下【win+g】就行了二是用其他的录制软件来录制,比如“迅捷屏幕录像工具”,操作方法如下:1、首先在电脑上将这个工具下载下来。下载完成后打开工具,主页...

  • win7硬件加速设置方法

    win7硬件加速设置方法

    有很多网民在玩一些游戏或运行一些大软件,下载大文件,可能会觉得系统运行不够无忧无虑,这次可以尝试加速硬件。下面的小边将为您介绍如何设置win7的硬件加速方法。1.右击桌面空白处,然后点击右键菜单中的屏幕分辨率选项。2.进入电脑屏幕分辨率设置...

  • 迅雷下载速度慢怎么办-迅雷下载速度慢解决方法

    迅雷下载速度慢怎么办-迅雷下载速度慢解决方法

    迅雷下载速度慢怎么办?迅雷是目前国内用户使用最多的高速下载工具,其速度和效率都是同类下载工具的顶点,但是很多用户在使用的时候却发现迅雷的下载速度很慢,这其实是因为多个不同的问题导致的,那么我们该如何解决呢?下面就由小编为大家带来迅雷下载速度...

  • java中tostring方法的作用是什么

    java中tostring方法的作用是什么

    java中tostring方法的作用是会返回一个【以文本方式表示】此对象的字符串,结果是一个简明但易于读懂的信息表达式。java中tostring方法的作用是toString方法会返回一个“以文本方式表示”此对象的字符串。结果是一个简明但易...

  • 电脑运行内存怎么扩大 秒懂:电脑内存扩大内存的方法

    电脑运行内存怎么扩大 秒懂:电脑内存扩大内存的方法

    电脑运行内存怎么扩大?这是许多电脑用户常常遇到的问题。想要提升电脑运行速度和性能,扩大内存是一个有效的方法。但是,如何扩大内存呢?在本文中,php小编西瓜将为你介绍一些简单又实用的方法,让你秒懂如何扩大电脑内存,提升电脑的运行效率。无论你是...

  • 修复 Windows 11 中 Sxstrace.exe 运行时错误的 5 种方法

    修复 Windows 11 中 Sxstrace.exe 运行时错误的 5 种方法

    windows用户有时会发现启动程序很困难,在这种情况下可能会收到一条错误消息,要求使用命令行sxstrace.exe工具了解更多详细信息。sxstrace.exe由Microsoft于2006年11月首次为Windo...

  • CSS颜色设置方法:HEX、RGB、HSL的简单对比

    CSS颜色设置方法:HEX、RGB、HSL的简单对比

    css中,颜色值有多种表示方法,例如颜色名、十六进制颜色、rgb()、hex()、hsl()等等。那你知道hex、rgb和hsl之间有什么区别吗?下面本篇文章就来给大家简单对比一下hex、rgb、hsl,看看它们区别。不知道你是否了解HE...

  • 如何解决 Windows 7 远程桌面出现黑屏的问题:11 种方法

    如何解决 Windows 7 远程桌面出现黑屏的问题:11 种方法

    远程桌面连接(rdc)是专业版和企业版windows上的一项有用功能,允许用户远程连接到另一台计算机,而无需其他软件。但是windows11远程桌面上的黑屏可能会毁掉这一切。黑屏问题是用户遇到的最常见问题之一。你想知道为什么屏...

  • 周排行
  • 月排行
  • 年排行

精彩推荐