2、マクロ関数
6795 ワード
最大値、最小値:
類似:
スワップ関数:
ビット操作関数:
サイズ変換:
循環シフト:
バイトの配置:
位置揃え:
メモリ管理:
C変長配列:
数値変換バイナリ表示:
変数名と値を印刷します.
#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