2、宏函数

最大值、最小值:

#define Max(a, b)                       ((a) > (b) ? (a) : (b))
#define Min(a, b)                       ((a) < (b) ? (a) : (b))

相似:

#define Similay(a, b, e)                (Max(a, b) - Min(a, b)) <= (e)

交换函数:

#define SwapVal(a, b)                   ((a) ^= (b) ^= (a) ^= (b))
#define UpdateMaxVal(max, min)          ((max) < (min) ? SwapVal((max), (min)) : (max))
#define UpdateMinVal(min, max)          ((min) > (max) ? SwapVal((min), (max)) : (min))

位操作函数:

#define LCPL_BIT(value, bit)            ((value) ^= (1<<(bit)))   //取反指定位
#define LSET_BIT(value, bit)            ((value) |= (1<<(bit)))   //置位指定位
#define LCLR_BIT(value, bit)            ((value) &= ~(1<<(bit)))  //清零指定位
#define LGET_BIT(value, bit)            ((value) & (1<<(bit)))    //读取指定位
#define HCPL_BIT(value, bit)            ((value) ^= (1<<(7-(bit))))   //取反指定位
#define HSET_BIT(value, bit)            ((value) |= (1<<(7-(bit))))   //置位指定位
#define HCLR_BIT(value, bit)            ((value) &= ~(1<<(7-(bit))))  //清零指定位
#define HGET_BIT(value, bit)            ((value) & (1<<(7-(bit))))    //读取指定位

//多字节从低位pos位置获取连续len长度的bit位的数值;
#define BitValL(val, pos, len)          (((((val) & 0xffffffff) << (32 - (pos) - (len))) & 0xffffffff) >> (32 - (len)))
//单字节从高位pos位置获取连续len长度的bit位的数值;
#define BitValH(val, pos, len)          ((pos) + (len) <= 8 ? (((((val)&0xff) << (pos)) & 0xff) >> (8 - (len))) : (val))
#define BitValH16(val, pos, len)        (((sizeof(val) >= 2) && ((pos) + (len) <= 16)) ? ((BLSwap16(val) & (0xffff >> pos)) >> (16 - pos - len)) : (val))
#define BitValH32(val, pos, len)        (((sizeof(val) == 4) && ((pos) + (len) <= 32)) ? ((BLSwap32(val) & (0xffffffff >> pos)) >> (32 - pos - len)) : (val))

大小端转换:

#define BLSwap16(A)                     ((((A) & 0xff00) >> 8) | (((A) & 0x00ff) << 8))
#define BLSwap32(A)                     ((((A) & 0xff000000) >> 24) | \
                                        (((A) & 0x00ff0000) >> 8) | \
                                        (((A) & 0x0000ff00) << 8) | \
                                        (((A) & 0x000000ff) << 24))
#define BLSwap64(A)                     ((((A) & 0xff00000000000000) >> 56) | \
                                        (((A) & 0x00ff000000000000) >> 40) | \
                                        (((A) & 0x0000ff0000000000) >> 24) | \
                                        (((A) & 0x000000ff00000000) >> 8) | \
                                        (((A) & 0x00000000ff000000) << 8) | \
                                        (((A) & 0x0000000000ff0000) << 24) | \
                                        (((A) & 0x000000000000ff00) << 40) | \
                                        (((A) & 0x00000000000000ff) << 56))

循环位移:

#define ROTATE_LEFT(v, s, n)            ((v) << (n)) | ((v) >> ((s) - (n)))
#define ROTATE_RIGHT(v, s, n)           ((v) >> (n)) | ((v) << ((s) - (n)))
#define ROTATE_LEFT32(v, n)             ROTATE_LEFT((unsigned)(v), 32, n)
#define ROTATE_RIGHT32(v, n)            ROTATE_RIGHT((unsigned)(v), 32, n)
#define ROTATE_LEFT16(v, n)             ROTATE_LEFT((unsigned)(v), 16, n)
#define ROTATE_RIGHT16(v, n)            ROTATE_RIGHT((unsigned)(v), 16, n)
#define ROTATE_LEFT8(v, n)              ROTATE_LEFT((unsigned)(v), 8, n)
#define ROTATE_RIGHT8(v, n)             ROTATE_RIGHT((unsigned)(v), 8, n)

字节对齐:

#define ByteAlign(ByteLen, ByteWidth)   (((ByteLen) + (ByteWidth) - 1) / (ByteWidth) * (ByteWidth))

位对齐:

#define AlignPixel32Bit(width, pixelBit)   (((long long int)((width) * (pixelBit) + 31) & ~31) >> 3)

内存管理:

#define MCalloc(T, N)                   ((N) > 0 ? (T *)calloc((size_t)(N), sizeof(T)) : NULL)
#define MMalloc(T, N)                   ((N) > 0 ? (T *)malloc(sizeof(T)*N) : NULL)
#define MFree(p)                        if(p){free(p); p = NULL;}

#define MNew(T)                      new T
#define MDelete(p)                   if(p){delete p; p = nullptr;}
#define MDeleteV(T, p)               if(p){T*pp=(T*)p; delete (pp); (p) = (nullptr);}
#define MNewArr(T, N)                (T *)(new T[N]);
#define MDeleteArr(p)                if(p){delete [] (p); (p) = (nullptr);}

C变长数组:

/* 变长数组添加操作 (数组指针,计数器,已分配内存,数据,数据类型,返回值) */
#define C_RESIZE_WIDTH  100
#define CAdd(arrPtr, counter, nAllocated, data, T, width, ret) \
{ T *p; int new_size; ret=-1; \
    if(counter >= nAllocated){ \
        new_size = 2* nAllocated ; \
        if(new_size < (width) ) new_size = width; \
        p = MCalloc(T, new_size); \
        if(p){  \
            memcpy(p, arrPtr, counter*sizeof(T) ); \
            MFree(arrPtr); \
            arrPtr = p; \
            nAllocated = new_size; \
            ret=0; \
        }   \
    }else{ ret=0; } \
    if(ret==0) arrPtr[counter++] = (data); \
}

#define CADD(arrPtr, counter, nAllocated, data, T, ret) \
            CAdd(arrPtr, counter, nAllocated, data, T, C_RESIZE_WIDTH, ret)

数值转换二进制显示:

#define ntob(a, str, num)   \
{                           \
    int aBitNum = sizeof((a)) * 8;   \
    int loopNum = 1;        \
    int shift = 0;          \
    int mod = aBitNum;      \
    char tmp[64] = {0};     \
    char *pbuf = (char *)(str);       \
    if(aBitNum > 32){loopNum = 2; shift = 32; mod = 32;} \
    int bitNum = 0;            \
    while(loopNum-- > 0){    \
        int aint = (a) >> shift;              \
        /*printf(#a"=0x%llx, aint=%x, shift=%d ", a, aint, shift);*/  \
        itoa(aint, tmp, 2);         \
        int len = strlen(tmp);      \
        int cnt = len % mod;        \
        /*printf("len=%d, cnt=%d\n", len, cnt);*/   \
        if(cnt != 0){               \
            cnt = mod - cnt;        \
            memset(pbuf, '0', cnt); \
            pbuf += cnt;            \
        }   \
        memcpy(pbuf, tmp, len);     \
        pbuf += len;                \
        bitNum += cnt + len;        \
        shift-=32;  \
    }   \
    if(aBitNum < bitNum){memcpy((str), (str)+bitNum-aBitNum, aBitNum); (str)[aBitNum] = 0;}  \
    num = Min(bitNum, aBitNum);   \
}


#define PrintBitNum(a)  \
{   \
    char aName[8] = {' '}; \
    char str[128] = {0};  \
    int len = 0;    \
    memset(aName, ' ', sizeof(aName));  \
    len = snprintf(aName, sizeof(aName), "%s", #a);  \
    if(len < sizeof(aName)) aName[len] = ' ';   \
    aName[7] = 0;       \
    printf("%s:", aName);  \
    if(sizeof(a) <= 4) \
        printf("0x%08x ", a);  \
    else    \
        printf("0x%016llx ", a);  \
    ntob(a, str, len); \
    /*printf(#a"=%d, len=%d, %s\n", a, len, str);*/    \
    for(int i=0; i<len; i++){   \
        if(i%8==0 && i!=0) printf(" ");   \
        printf("%c", str[i]);   \
    }   \
    printf("\n");   \
}

#define PrintBitChar(cp, num)  \
{   \
    char aName[8] = {' '}; \
    char str[10] = {0};  \
    int len = 0;    \
    char *ap = (char *)cp;   \
    memset(aName, ' ', sizeof(aName));  \
    len = snprintf(aName, sizeof(aName), "%s", #cp);  \
    if(len < sizeof(aName)) aName[len] = ' ';   \
    aName[7] = 0;       \
    printf("%s:", aName);  \
    for(int i=0; i<num; i++){   \
        ntob(ap[i], str, len); \
        /*printf(#a"=%d, len=%d, %s\n", a, len, str);*/    \
        printf("%s ", str);     \
    }   \
    printf("\n");   \
}

打印变量名和值:

#define PrintVal(str) cout << #str << " = " << str << endl

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值