位操作函数

来源:互联网 发布:算法导论 知乎 编辑:程序博客网 时间:2024/06/07 23:11

 

#include <stdio.h>
#include <string.h>

#define PRESENT_BIT(x)   (0x00000001<<(x-1))
#define BIT_ON(m, b)   (((m) & PRESENT_BIT(b)) != 0)
#define SET_BIT(m, b)   ((m) |= PRESENT_BIT(b))
#define CLEAR_BIT(m, b)   ((m) &= ~PRESENT_BIT(b))

 int set_bit(unsigned char *p_startAddr,unsigned int dw_bitLen,unsigned int dw_bitNum)
{
     if(!p_startAddr)
     {
         printf("no input parameter/n");
         return -1;
     }
     if(dw_bitNum >dw_bitLen || dw_bitNum<=0)
     {
         printf("dw_bitNum=%d, is larger than dw_bitLen=%d/n",dw_bitNum,dw_bitLen);
        return -1;
     }

     unsigned char uc_mask = 0x01;
     unsigned int dw_index = (unsigned int)((dw_bitNum-1)/8);
     unsigned char uc_bitter = (dw_bitNum-1)%8;
     p_startAddr[dw_index] = p_startAddr[dw_index] | (uc_mask << uc_bitter);

     return 0;
 
}

int clear_bit(unsigned char *p_startAddr,unsigned int dw_bitLen,unsigned int dw_bitNum)
{
      if(!p_startAddr)
      {
          printf("no input parameter/n");
          return -1;
      }
     if(dw_bitNum >dw_bitLen || dw_bitNum<=0)
     {
         printf("dw_bitNum=%d, is larger than dw_bitLen=%d/n",dw_bitNum,dw_bitLen);
          return -1;
     }

     unsigned char uc_mask = 0x01;
     unsigned int dw_index = (unsigned int)((dw_bitNum-1)/8);
     unsigned char uc_bitter = (dw_bitNum-1)%8;
     p_startAddr[dw_index] = p_startAddr[dw_index] &(~(uc_mask << uc_bitter));

     return 0;
}

 int bit_on(unsigned char *p_startAddr,unsigned int dw_bitLen,unsigned int dw_bitNum)
{
      if(!p_startAddr)
      {
          printf(" no input parameter/n");
          return 0;
      }
     if(dw_bitNum >dw_bitLen || dw_bitNum<=0)
     {
         printf("dw_bitNum=%d, is or invalid, or larger than dw_bitLen=%d/n",dw_bitNum,dw_bitLen);
         return 0;
     }

     unsigned char uc_mask = 0x01;
     unsigned int dw_index = (unsigned int)((dw_bitNum-1)/8);
     unsigned char uc_bitter = (dw_bitNum-1)%8;
     unsigned char uc_result = p_startAddr[dw_index] &(uc_mask << uc_bitter);

     return uc_result;
}

//位操作测试函数
void main()
{
     unsigned char uc_bitMap[100];
     memset(uc_bitMap,0,sizeof(uc_bitMap));
   
     int i;
     for(i=0;i<=sizeof(uc_bitMap)*8;i++)
     {
          if(bit_on(uc_bitMap,sizeof(uc_bitMap)*8,i))
           printf("bitNum %d is on/n",i);
     }

     set_bit(uc_bitMap,sizeof(uc_bitMap)*8,sizeof(uc_bitMap)*8);
     for(i=0;i<=sizeof(uc_bitMap)*8;i++)
     {
          if(bit_on(uc_bitMap,sizeof(uc_bitMap)*8,i))
         printf("bitNum %d is on/n",i);
     }

     clear_bit(uc_bitMap,sizeof(uc_bitMap)*8,sizeof(uc_bitMap)*8);
     for(i=0;i<=sizeof(uc_bitMap)*8;i++)
     {
          if(bit_on(uc_bitMap,sizeof(uc_bitMap)*8,i))
          printf("bitNum %d is on/n",i);
     }
}

原创粉丝点击