位操作函数
来源:互联网 发布:算法导论 知乎 编辑:程序博客网 时间: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);
}
}
- 一些位操作函数
- 位操作函数
- 一个位操作函数
- 自定义函数实现位操作
- 位操作的几个函数
- 32位程序专用文件操作函数
- PHP位域操作函数封装
- [MSSQL]自定义函数实现位操作
- JS封装的几个位操作函数
- stm32位操作函数(未完待续)
- 位域操作的函数封装
- 类型转换、位操作符、函数简介
- 位操作相关宏与函数
- verilog中几种常用的位操作函数
- 【叶子函数分享三十一】自定义函数实现位操作
- 位操作
- 位操作
- 位操作
- ASP学习笔记
- ASP学习笔记
- Asp.NET 连接Access数据库报错
- pthread_join函数及linux线程
- 终于在unubtu下安装了netbeans6.1
- 位操作函数
- Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结
- 根据日期获取当月有几天
- 33344
- web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序 研究
- 铁路售票系统应用软件需求分析报告
- 判断文本中是否是数字
- 视频转发系统
- jsp中session对象