文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>位操作杂记

位操作杂记

时间:2009-06-03  来源:tastesweet

有六个位操作符,他们是: & 按位与
|   按位或
^  按位异
~  按位求反
>>  右移 ,这里需要注意的是数据整体的移动不是某一位的移动
<<  左移 ,  这里需要注意的是数据整体的移动不是某一位的移动
例如:
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<<y) //将X的第Y位置1
#define clrbit(x,y) x&=~(1<<y) //将X的第Y位清0
这样我们这么写:
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<<i*2);
     GPFUP=0x0;
     gpio_mask&=( ~(1<<i) );
    }
    mask=(mask<<1);
   }
   mask=0x01;
相关阅读 更多 +
排行榜 更多 +
枪战突击

枪战突击

飞行射击 下载
其乐无穷

其乐无穷

飞行射击 下载
音速射击

音速射击

飞行射击 下载