位操作

来源:互联网 发布:obs直播软件 清晰度 编辑:程序博客网 时间:2024/06/10 05:38


//==========================================================================
#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
            

 


 

原创粉丝点击