打印

C语言位操作方法

[复制链接]
3006|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FVJFIFE|  楼主 | 2011-9-20 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C语言既有高级语言的各种特点,又可对硬件进行操作,并对进行结构化程序设计,用C语言编写的程序较容易移植,它们可生成简洁可靠的目标代码,在代码效率和代码执行速度上完全可以和汇编媲美。采用C语言进行单片机编程是嵌入式程序设计的发展趋势。但是,在嵌入式控制等领域,经常需要控制某一个二进制位,然而除了Keil C51等C环境外,很多单片机C环境都没有扩充对位变量定义的关键字,甚至单片机本身的硬件上也没有对单个位操作的汇编指令,这使得已习惯MCS-51内核单片机Keil C51编程的用户都为其C环境不能对位变量进行位操作而烦恼。
1 用“读-修改-写”方法实现对单个位的位操作
     一般采用“读-修改-写”的方法实现单个位的位操作,通过与0“与”操作,将某一位清0。如使i变量的b0位为0,实现方法为i=i&0xfe。通过与1“或”操作,将某一位置1。如使i变量的b0位为1,实现方法为i=i|0x01。通过与1“异或”操作,将某一位取反。如使i变量的b0位取反,实现方法为i=i^0x01。
注意:错误“读-修改-写”方法时不要影响其他位,即某位清零时,其他位与1“与”;某位置1时,其他位与0“或”;取反时,其他位与0“异或”。
为了方便程序设计和增加程序可读性,很多程序员喜欢采用下面的移位方式实现单个位的位操作,语句简练,可读性强,比如在某单片机的B口连接1个发光二极管,其点亮操作方法如下:
#define bit(x) (1<<(x))

相关帖子

沙发
FVJFIFE|  楼主 | 2011-9-20 23:19 | 只看该作者
提示: 该帖被管理员或版主屏蔽
板凳
FVJFIFE|  楼主 | 2011-9-20 23:19 | 只看该作者
2 通过位域的方法实现位操作
标准C提供了一种基于结构体的数据结构--位域(BitField),位域就是把一个存储单元中的二进制划分为几个不同的区域。并说明每个区域的位数。每一个域有一个域名,允许在程序中按域名进行操作,位域的定义格式如下:
struct 位域结构名{

位域列表 };

位域列表格式为:类型说明符 位域名:位域长度如:

struct k{

unsigned int a:1

unsigned int :2

unsigned int b:3

unsigned int :0     //空域

}k1;
说明:
1)各位依次从低位到高位排列,排满一个存储单元,按地址接着排下一单元;
2)位域可以无域名,但不能被引用,如第二域,这时其只用来填充或调整位置;
3)第四行称空域,目的是将目前存储单元的剩余部分分为一个域,且填充0。
位域的引用很简单,如:
k1.a=1; //置k1的b0位为1

使用特权

评论回复
地板
FVJFIFE|  楼主 | 2011-9-20 23:19 | 只看该作者
k1.b=7; //将k1的b3-5位置111
通过位域定义位变量,是实现单个位位操作的重要途径和方法,采用位域定义位变量,产生的代码紧凑、高效。定义的方法如下:




通过位域定义位,再通过宏进行定义,可以方便地将Keil C51等程序移植到其他C编译器,从而不再为没有位操作而苦恼。
对一个单片机的所有I/O口,通过将位域结构指定到I/O端口地址,I/O口便都可以采用位域进行宏定义,这样,操作I/O口就可以像Keil C51编程一样方便。

使用特权

评论回复
5
tianm| | 2011-9-20 23:47 | 只看该作者
你分帖发 也不要从程序中间分啊 看来得制定个新规定了

使用特权

评论回复
6
kfliuyan| | 2011-9-21 10:43 | 只看该作者
学习C语言   入门就好学了

使用特权

评论回复
7
金鱼木鱼| | 2011-9-21 12:16 | 只看该作者
不错,看着受教了

使用特权

评论回复
8
tuzihog| | 2011-9-22 22:52 | 只看该作者
好的
学习了!
位域的概念还是第一次接触,谢谢楼主的贡献

使用特权

评论回复
9
lilihua0721| | 2011-10-3 19:49 | 只看该作者
c语言,在用的时候多试验,慢慢积累就好了!

使用特权

评论回复
10
lfzhou1006| | 2011-10-10 09:58 | 只看该作者
曾经在大学里面一个月攻下了C语言,相当的自豪啊,呵呵

使用特权

评论回复
11
lcq07| | 2011-10-10 17:08 | 只看该作者
曾经在大学里面一个月攻下了C语言,相当的自豪啊,呵呵
lfzhou1006 发表于 2011-10-10 09:58

一个月攻下NB

使用特权

评论回复
12
opyy125689| | 2011-10-10 20:36 | 只看该作者
哥 二级都没过

使用特权

评论回复
13
zxf0168| | 2013-12-31 16:30 | 只看该作者
学习了,说来说去都是C语言

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

897

帖子

1

粉丝