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