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<> (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
", 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
", a, len, str);*/ \ for(int i=0; i

変数名と値を印刷します.
#define PrintVal(str) cout << #str << " = " << str << endl