位运算

1.使c区别于许多高级语言的特性之一,是访问整数中的个别位的能力。该特性通常是程序与硬件设备和c操作系统相连接的关键

c语言中两个主要的访问位的工具。位运算符(|  ,& , >> 右移, << 左移);在结构体中创建位字段的能力

二进制 0 1 可以用于表示计算机内存和寄存器中位的打开和关闭状态,所以计算机硬件与二进制数字系统紧密相连。

示例1:打印整数对应的二进制位

void bin_dis(int var)
{
   int  i=8;
   while(i--){
       if(var & 1<<i)
             printf("1");
       else 
             printf("0");
        if(i%4 == 0)
           printf(" ");  
   }
  printf("\n");
}

2.掩码 mask
   unsigned  char MASK = 1<<1;

   unsigned  char flag = 0x96;

位于掩码结合的功能:

打开位 (将某一位置1) flag |=MASK;

关闭位(将某一位置0) flag &=~MASK;

转置位(位反转) flag ^=MASK;

查看某一位的值  if((flag&MASK) == MASK)

示例2:n位掩码的生成

int  n = 8;
int mask =0;

while(n--)
{
   mask |=(1<< n);
}

int mask=(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)

for(int i =6;i>=2;i--)
{
   mask |= (1<<i) 
}

示例3 实现循环移位,当n>0 的时候左移,n<0的时候循环右移

void circleMove(/*unsigned */int *pdata,int n)
{
   int m;
   if(n<0)
      m = -n;
   else
      m = n;
unsigned int mask = 0;

 while(m--)
{
   mask |= (1<<m);
}
 if(n>0)//左循环
{
 *pdata = (*pdata<<n) | mask &(*pdata>>(sizeof(*pdata)*8-n));
}
  else //右循环
{
 *pdata = (*pdata>>-n)| (mask &*pdata)<<(sizeof(*pdata)*8-(-n));
 }
}

3.无参交换(无溢出) 异或之后出现0的情况要慎重

 void swap(int *p1,int *p2)

{

   *p1=*p1^*p2;

   *p2= *p1^*p2;

    *p1=*p1^*p2;

}

 

posted on 2016-04-12 10:38  碎紫妖瞳  阅读(211)  评论(0编辑  收藏  举报

导航