C中的内存高效标志数组
发布时间:2020-12-16 10:29:41 所属栏目:百科 来源:网络整理
导读:我需要在内存中存储一??个非常长的数组.每个数组项只是一个标志TRUE / FALSE(0/1).我需要它的内存效率非常高,所以我想把它作为一个掩码位实现在unsigned char区域之上.内存中的每个字符都应该给我至少8个标志.我已经实现了以下功能: static SIZE = 8; /* 8
我需要在内存中存储一??个非常长的数组.每个数组项只是一个标志TRUE / FALSE(0/1).我需要它的内存效率非常高,所以我想把它作为一个掩码位实现在unsigned char区域之上.内存中的每个字符都应该给我至少8个标志.我已经实现了以下功能:
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数组而不是使用它作为全局数组. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |