位操作函数

本文介绍了一种位操作的实现方式,包括设置、清除和检查特定位的状态。通过定义宏和编写函数来完成位的设置与清除,并提供了一个测试函数来验证这些位操作的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#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);
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值