Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1609263
  • 博文数量: 245
  • 博客积分: 10378
  • 博客等级: 上将
  • 技术积分: 2571
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 08:19
文章分类

全部博文(245)

文章存档

2013年(4)

2012年(8)

2011年(13)

2010年(68)

2009年(152)

分类: LINUX

2009-06-03 11:55:13

有六个位操作符,他们是:
& 按位与
|   按位或
^  按位异
~  按位求反
>>  右移 ,这里需要注意的是数据整体的移动不是某一位的移动
<<  左移 ,  这里需要注意的是数据整体的移动不是某一位的移动
例如:
1<<3   就是二进制数00001左移3位成为:01000
3<<3  就是二进制数00011左移3位成为:11000
自己的错误认识是只能对单个位进行移位,这样我们在对一个寄存器进行设置的时候可以使用下边的方法:
如何设置寄存器的位?
例如:
 rADCCON = (0 << 0)  | (0 << 1)  |  (0 << 2)   |  (ch << 3)    |  (1 << 6)|  (1 << 14)   ; 
 像这样,如果对某一位置1,就可以1<<第几位,然后与该寄存器相与就可以了,置0也是。
在这个操作的前提是该寄存器初始化的值为0,如果不是0,那么要置0的位相与之后未必是0,
所以可以在前边加如下:
rADCCON=(rADCCON & 0x00) |(0 << 0)  | (0 << 1)  |  (0 << 2)   |  (ch << 3)    |  (1 << 6)|  (1 << 14)   ; 
如果我们只需要对某一些对进行操作,而其他为不需要修改。可以借鉴上边的操作:
rADCCON=(rADCCON & 0x【mask】) |(0 << 0)  | (0 << 1)  |  (0 << 2)   |  (ch << 3)    |  (1 << 6)|  (1 << 14)   ; 
通过0x【mask】与寄存器相与,把需要修改的位清零,然后在相与,就可以在保护不需要修改位的前提下,修改需要修改的位。
下边的方法是如果对寄存器位清零与位置1
#define setbit(x,y) x|=(1<#define clrbit(x,y) x&=~(1<这样我们这么写:
rADCCON&=~( (1 << 0)  | (1 << 1)  |  (1 << 2)   |  (1 << 3)    |  (1 << 6)|  (1 << 14)  ) ; 
另外一个技巧:
mask=0x01;
int  i=0;
 for(i=0;i<8;i++)
   { 
    if( (arg&mask)!=0  )
    {
     GPFCON&=~(3<     GPFUP=0x0;
     gpio_mask&=( ~(1<    }
    mask=(mask<<1);
   }
   mask=0x01;
阅读(1121) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-06-08 11:07:47

好服月租型IT服务台,与你共成长! 月租型ITSM软件,注册即可免费体验! 详情请登录官方网站:http://www.servicezon.com