jianhong_wu 发表于 2014-10-31 15:16:13

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

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

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

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

Ray-上海:
把一个字节当成8个位使用,为了方便读取判断某一位,用联合结构体处理如下:
union
{
        struct
        {
                unsigned b0:1;
                unsigned b1:1;
                unsigned b2:1;
                unsigned b3:1;
                unsigned b4:1;
                unsigned b5:1;
                unsigned b6:1;
                unsigned b7:1;
        }oneBit;
        unsigned char flag;
}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变量会更加简单快捷。


页: [1]
查看完整版本: 如何用联合结构体把1个char字节变量变成8个bit变量来使用?已解答。