智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3545|回复: 5
打印 上一主题 下一主题

CW中变量位操作的另一种高效方法[原创]

[复制链接]

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
跳转到指定楼层
1#
发表于 2009-9-15 08:18:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家熟知的51有位定义和位操作符,但非常不利用程序的移植,现在的很多控制处理器都不用了.飞思的也不支持这种位操作.
   这里介绍一种方法,对变量的位直接进行操作,不用"与""非""或"运算:
   通过将一个变量的地址强行绑定在一个位段的指针上,并通过该指针来访问位段,实现对该变量任意二进制位单独操作.
DATABit,例如,我要操作DATABit的第4位,怎么实现呢?
typedef struct
{
    unsigned bit0 :1;
    unsigned bit1 :1;
    unsigned bit2 :1;
    unsigned bit3 :1;
    unsigned bit4 :1;
    unsigned bit5 :1;
    unsigned bit6 :1;
    unsigned bit7 :1;
}BYTE2BIT;

byte DATABit;
void main(void) {

  EnableInterrupts; /* enable interrupts */
  /* include your code here */

  (*((BYTE2BIT*)(&DATABit))).bit4=1;


  for(;;) {
    __RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

   对于byte变量DataBit,表达式先通过"&"运算获得其地址.
   接下来,将这一地址的类型强行绑定为指向位域Byte2Bit的指针
   最后,利用指针操作符"*",就可以对DataBit变量的任何一个二进制位了.
  关于位操作的那些说明,还可以参考张明峰的个IDE介绍.这里不多说.

http://blog.eccn.com/space.php?uid=353091&do=blog&id=1043

5

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
QQ
威望
361
贡献
20
兑换币
0
注册时间
2009-11-16
在线时间
54 小时
2#
发表于 2010-1-6 21:22:58 | 只看该作者
真的不错
回复 支持 反对

使用道具 举报

5

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
QQ
威望
361
贡献
20
兑换币
0
注册时间
2009-11-16
在线时间
54 小时
3#
发表于 2010-1-6 21:23:01 | 只看该作者
真的不错
回复 支持 反对

使用道具 举报

3

主题

64

帖子

0

精华

等待验证会员

积分
31797

优秀会员奖章

QQ
威望
19375
贡献
12346
兑换币
0
注册时间
2009-10-31
在线时间
38 小时
4#
发表于 2010-1-19 14:25:49 | 只看该作者
在51上能这么用么??
回复 支持 反对

使用道具 举报

3

主题

64

帖子

0

精华

等待验证会员

积分
31797

优秀会员奖章

QQ
威望
19375
贡献
12346
兑换币
0
注册时间
2009-10-31
在线时间
38 小时
5#
发表于 2010-1-19 14:25:52 | 只看该作者
在51上能这么用么??
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

注册会员

Rank: 2

积分
188
威望
130
贡献
46
兑换币
0
注册时间
2012-3-31
在线时间
6 小时
6#
发表于 2012-5-14 13:14:01 | 只看该作者
typedef struct byte
{
    unsigned bit0 :1;
    unsigned bit1 :1;
    unsigned bit2 :1;
    unsigned bit3 :1;
    unsigned bit4 :1;
    unsigned bit5 :1;
    unsigned bit6 :1;
    unsigned bit7 :1;
}Bitbyte;
Bitbyte example;
example.4=1;
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-6 00:40 , Processed in 0.624632 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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