位操作

转载 2012年03月28日 21:54:20


//==========================================================================
#define SET_BIT(data,bit)   ((data) |= (0x01l<<(bit)))
#define CLR_BIT(data,bit)   ((data) &= (~(0x01l<<(bit))))
#define CPL_BIT(data,bit)   ((data) ^= ((0x01l<<(bit))))
#define GET_BIT(data,bit)   (((data)&(0x01l<<(bit))) == (0x01l<<(bit)))

#define SET_BIT_EX(data,bit)  SET_BIT(data[(bit)/32], ((bit)%32))
#define CLR_BIT_EX(data,bit)  CLR_BIT(data[(bit)/32], ((bit)%32))
#define CPL_BIT_EX(data,bit)  CPL_BIT(data[(bit)/32], ((bit)%32))
#define GET_BIT_EX(data,bit)  GET_BIT(data[(bit)/32], ((bit)%32))
//获取位变量(获取data变量从第bitbase位起始的bitlen个位组成的变量(bitbase+bitlen)必须小于或等于32
#define GET_BIT_VAR(data, bitbase, bitlen) ((data)<<(32-(bitlen)-(bitbase))>>(32-bitlen))

#define OFFSETOF(s,m)    ((int)&(((s*)NULL)->m))

#ifndef ARRAYLEN
 #define ARRAYLEN(x)    (sizeof(x)/sizeof(x[0]))
#endif //ARRAYLEN

#ifndef DPrintf
 #define DPrintf(x,arg...) printf(x,##arg)
#endif //DPrintf

#define FOPrintf(x,arg...)  {DPrintf("File:%s Line:%d ",__FILE__,__LINE__);DPrintf(x,##arg);}
#define BREAKPOINT()   {FOPrintf("breakpoint any key to continus...\r\n");fflush(stdout);getchar();}

int udp_sendto(int sFd, void *pBuf, int len, char *pIp, int nPort);
int udp_open(struct sockaddr_in *pSock, int Port);
void TraceMem(int DbgLvl, void *Data, unsigned int buflen,unsigned int DataMode,unsigned int LineDataLen);


//==========================================================================
//xiangzi add 2011-5-25 11:24:56

//位操作

#define SETBIT(Data,Bit)  do{  Data |= (1<<Bit); }while(0)   //设置某个无符号数的某个位为1
#define CLRBIT(Data,Bit)  do{  Data &= ~(1<<Bit); }while(0)   //设置某个无符号数的某个位为0
#define TSTBIT(Data,Bit)  (Data & (1<<Bit))      //

//内存方式,小端存储方式
//#define SETBIT_8EX_INC(data,bit)  SET_BIT(data[(bit)/8], (7-(bit)%8))
//#define CLRBIT_8EX_INC(data,bit)  CLR_BIT(data[(bit)/8], (7-(bit)%8))
//#define CHECKBIT_8EX_INC(data,bit)   (((data[(bit)/8]&(0x01<<(7-(bit)%8)))==(0x01<<(7-(bit)%8)))?1:0)
      //查询某个位是否为1
      
#define SETBIT_8EX(data,bit)  SET_BIT(data[(bit)/8], ((bit)%8))
#define CLRBIT_8EX(data,bit)  CLR_BIT(data[(bit)/8], ((bit)%8))
#define CHECKBIT_8EX(data,bit)   (((data[(bit)/8]&(0x01<<((bit)%8)))==(0x01<<((bit)%8)))?1:0)      

#define SETBIT_32EX(data,bit)  SET_BIT(data[(bit)/32], ((bit)%32))
#define CLRBIT_32EX(data,bit)  CLR_BIT(data[(bit)/32], ((bit)%32))
#define CHECKBIT_32EX(data,bit)   (((data[(bit)/32]&(0x01<<((bit)%32)))==(0x01<<((bit)%32)))?1:0)  
      
//==========================

#define CHECKBIT(Data,Bit)   (((Data&(0x01<<Bit))==(0x01<<Bit))?1:0)  //查询某个位是否为1

#define GETBIT(Data,Bit)   CheckBit(Data,Bit)
#define ASSIGNBIT(Data,Bit,Value)  do{ Data =(Data &( ~(1<<Bit)))|(Value<<Bit); }while(0)//先清零该位再或Value
            

 


 

位操作点亮一个led

  • 2014年08月11日 23:15
  • 616B
  • 下载

C/C++基础-原码/反码/补码/位操作实现四则运算

原码/反码/补码,常见位操作,四则运算

PB位操作函数

  • 2012年04月01日 21:28
  • 114KB
  • 下载

头文件,位操作

  • 2014年03月28日 18:05
  • 5KB
  • 下载

VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案

VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案...
  • jdbc
  • jdbc
  • 2016年05月03日 06:35
  • 19616

C51 I2C 位操作

  • 2014年04月14日 16:39
  • 10KB
  • 下载

Java位操作工具类

  • 2013年10月14日 18:19
  • 3KB
  • 下载

VMware12提示 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。

VMware12提示 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。 此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态 ...

嵌入式Linux下C程序设计--位操作

  • 2012年09月03日 11:22
  • 867KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:位操作
举报原因:
原因补充:

(最多只允许输入30个字)