找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1645|回复: 8
收起左侧

一个位运算头文件

[复制链接]
ID:155811 发表于 2022-9-22 21:48 | 显示全部楼层 |阅读模式
一个位运算头文件,操作第几位,可以使用变量

BIT.H
  1. char bits[9]= {0,1,2,4,8,16,32,64,128};

  2. //v,需要设置的字节,
  3. //b,要设置第几位,从 第1 位开始
  4. #define BIT_SET(v,b) (v)|=bits[b]
  5. #define BIT_CLR(v,b) (v)&= ~bits[b]
  6. #define BIT_GET(v,b) (v)& bits[b]

  7. //ex.
  8. //char c=6,t;
  9. //BIT_SET(c,6); // c 的第6 位设置 1
  10. //BIT_CLR(c,2); //c 的第2位 清 0
  11. //t= BIT_GET(c,2);  读取c的 第2 位//
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:155811 发表于 2022-9-22 21:50 | 显示全部楼层
好用,欢迎使用
回复

使用道具 举报

ID:155811 发表于 2022-9-28 08:57 | 显示全部楼层
增加一个 某位取反运算

#define BIT_REV(v,b) v^= bits[b]  //把v 的 b位取反
回复

使用道具 举报

ID:624769 发表于 2022-9-28 09:42 | 显示全部楼层
宏指令头文件 不能这么写的……
宏指令的目的是: 在不影响运行效率的前提下, 使指令的易读性提高。
前提是不影响运行效率。这一点非常重要。

#define BIT_SET(v,b) (v)|= 0x01<<(b)
#define BIT_CLR(v,b) (v)&= ~(0x01<<(b))
#define BIT_GET(v,b) (v)& (0x01<<(b))

把这3个和你写的3个编译后 用实例对照看看, 比较一下代码大小,和执行速度的区别。
回复

使用道具 举报

ID:155811 发表于 2022-9-29 07:25 | 显示全部楼层
188610329 发表于 2022-9-28 09:42
宏指令头文件 不能这么写的……
宏指令的目的是: 在不影响运行效率的前提下, 使指令的易读性提高。
前 ...

左移运算效率高 还是 直接取数 效率高
回复

使用道具 举报

ID:491577 发表于 2022-9-29 09:32 | 显示全部楼层
99%的单片机应用不需要考虑效率,在大量使用延时函数的时代谈效率可笑,对于编程来说熟悉什么语句就用什么语句,自己会写最重要,至于那种语句效率高无需理会,少用延时函数效率最高,还有想要速度快,提高主频就行,理论上24M主频比12M快1倍,再怎么优化语句,12M主频快不过24M主频(指整个程序,不是单独某个语句)。提高主频谁都会。
回复

使用道具 举报

ID:624769 发表于 2022-9-30 00:26 | 显示全部楼层
himanzj 发表于 2022-9-29 07:25
左移运算效率高 还是 直接取数 效率高

就 你举的 三个例子来讲, “左移”效率高,  因为,没有“左移运算”,编译的时候,已经是结果了  实际程序运行没有“左移”这个动作。  而你查表是实打实的要去查的。
宏,不是编程,好的宏,应该不是增加MCU额外的工作,而是增加 代码的易读性。
否则的话,没必要写宏,写函数好了。
回复

使用道具 举报

ID:155811 发表于 2022-9-30 14:20 | 显示全部楼层
188610329 发表于 2022-9-30 00:26
就 你举的 三个例子来讲, “左移”效率高,  因为,没有“左移运算”,编译的时候,已经是结果了  实际 ...

宏命令中左移运算直接给出结果,宏命令只是编译前的字符替换
回复

使用道具 举报

ID:137736 发表于 2022-10-20 11:39 | 显示全部楼层
好用,还有别的方法,也在用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表