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


被折叠的 条评论
为什么被折叠?



