独闷闷网

 找回密码
 立即注册
搜索
查看: 2414|回复: 0
打印 上一主题 下一主题
收起左侧

[原创] 如何用联合结构体把1个char字节变量变成8个bit变量来使用?已解答。

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-31 15:16:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
伟-肇庆:
鸿哥,我倒是有一个建议.你全局变量,很多都是标志位赋值0或者1.何不用宏实现位操作,用位实现.

鸿哥--深圳:
我觉得RAM够用的情况下,直接用unsigned char 定义比较简单直接,而且方便我在不同的单片机上移植.

伟-肇庆:
比如:
  1. #define SETFLAG_X   flag|=1<<0
  2. #define CLRFLAG_X   flag&=~(1<<0)
复制代码
一个字节可当8个标志位使用用.
用宏实现,可读性也好.1个全局变量能实现的事,总比8个好.

Ray-上海:
把一个字节当成8个位使用,为了方便读取判断某一位,用联合结构体处理如下:
  1. union
  2. {
  3.         struct
  4.         {
  5.                 unsigned b0:1;
  6.                 unsigned b1:1;
  7.                 unsigned b2:1;
  8.                 unsigned b3:1;
  9.                 unsigned b4:1;
  10.                 unsigned b5:1;
  11.                 unsigned b6:1;
  12.                 unsigned b7:1;
  13.         }oneBit;
  14.         unsigned char flag;
  15. }myFlag;
复制代码



在不能操作bit的单片机中使用c语言的结构体和联合体一样可以实现,可以进行字节或者任意一位变量的操作.

鸿哥--深圳;
判断某一位的时候应该怎样判断?
if(myFlag.oneBit.b7==1)是这样判断吗?

Ray-上海:
嗯.


曹健-江苏:
伟,你这样定义,对于初学者看起来可能有点吃力.鸿哥的代码我看起来感觉逻辑比较清晰,理解起来也很容易.

鸿哥--深圳:
对.用的宏多了,就会把初学者搞晕.但是你的方法确实给大家提供了另外一种思路,在RAM资源紧缺的时候能派上用场。
另外,我跟大家讲讲用联合结构体其实还有一个小弊端:
用联合结构体的时候是这样的:if(myFlag.oneBit.b7==1)
用一个字节变量的时候是这样的:if(ucFlag==1).
表面上看,myFlag.oneBit.b7==1和ucFlag==1都是一条语句,但是你用了联合结构体后,经过C语言的编译后,它还会是一条语句吗?
我觉得里面肯定会有移位,与,等操作。也就是原来一条指令的语句,其实内部已经有很多条指令组成了。所以我觉得直接用一个char变量会更加简单快捷。


乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-11-29 18:40 , Processed in 0.164763 second(s), 17 queries .

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