最近在看c语言的书,觉得还蛮有意思,有点收获,收集了几个优美的小程序,与君共赏!
1)将10进制数装换为任意进制数的小函数
char * baseconv(unsigned int num, int base) { static char retbuf[33]; char *p; if(base < 2 || base > 16) return NULL; p = &retbuf[sizeof(retbuf)-1]; *p = ' '; do{ *--p = "0123456789abcdef"[num % base]; num /= base; }while(num != 0); return p; }
"abcdef"[5]可以理解为
char *p = "abcdef"; ...p[5]...
数组和下标在c语言中可以互换,所以也可写成5["abcdef"](不提倡哈,原因你懂的)
2)计算无符号整数中为1的位的个数
static int bittab[] = { 0,1,1,2, 1,2,2,3, 1,2,2,3, 2,3,3,4 }; int bitcount(unsigned int u) { int n = 0; for(; u != 0; u >>= 4) n += bittab[u & 0x0f]; return n; }
有关按位操作也没啥好介绍的,大家想想bittab的构造
3)free函数的封装
void saferFree(void **pp) { if(pp != NULL && *pp != NULL){ free(*pp); *pp = NULL; } } #define safeFree(p) saferFree((void**)&(p))
free函数不会检查传入的指针是否是NULL,也不会在返回前把指针置为NULL。释放指针之后将其置为NULL是个好习惯