大佬教程收集整理的这篇文章主要介绍了C中的内存高效标志数组,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
static SIZE = 8; /* 8 bits = 1 byte = 1 char */ /* creates and initializes the array for N elements */ unsigned char *new_bit_array(long n) { int extra = (n % SIZE) ? 1 : 0; size_t ms = ((n / SIZE)+extra) * sizeof(unsigned char); unsigned char *p = malloc(ms); memset(p,0xFF,ms); return p; } /* mask setter for nth bit of a char,call by function bit_array_set*/ char bit_mask_set(short nbit,short value) { if (value) return 0xFF; if (nbit == 0) return 0x7F; else if (nbit == 1) return 0xBF; else if (nbit == 2) return 0xDF; else if (nbit == 3) return 0xEF; else if (nbit == 4) return 0xF7; else if (nbit == 5) return 0xFB; else if (nbit == 6) return 0xFD; else if (nbit == 7) return 0xFE; return 0xFF; } /* mask setter for nth element of the array */ void bit_array_set(unsigned char *p,long i,int value) { p[i/] &= bit_mask_set(i % SIZE,value); } /* mask getter for nth bit of a char,call by function bit_array_get */ char bit_mask_get(short nbit) { if (nbit == 0) return 0x80; else if (nbit == 1) return 0x40; else if (nbit == 2) return 0x20; else if (nbit == 3) return 0x10; else if (nbit == 4) return 0x08; else if (nbit == 5) return 0x04; else if (nbit == 6) return 0x02; else if (nbit == 7) return 0x01; return 0x00; } /* mask getter for nth element of the array */ short bit_array_get(unsigned char *p,long i) { return p[i/SIZE] & bit_mask_get(i % SIZE) ? 1 : 0; }
这段代码工作正常,但我的问题是,如果在C或任何广泛使用的库(即glib)中有任何内置功能可以提供相同的功能吗?
…并且如果有更好的方法来实现bit_mask_get和bit_mask_set,那么7分支IF看起来很丑陋.对此代码的任何其他评论也非常欢迎.
unsigned char flag_bitmask[MAX_FLAGS]; void setFlag( int flag) { flag_bitmask[flag / 8] |= (1 << (flag % 8) ); } char isFlagSet(int flag) { return flag_bitmask[flag / 8] & (1 << (flag % 8) ); } void unSetFlag(int flag) { flag_bitmask[flag / 8] &= ~(1 << (flag % 8) ); }
我正在使用它,你可以传递flag_bitmask数组而不是使用它作为全局数组.
以上是大佬教程为你收集整理的C中的内存高效标志数组全部内容,希望文章能够帮你解决C中的内存高效标志数组所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。