我一直在使用Java中的Bitset类,我想在C中做类似的事情.我想我必须手动完成它作为C中的大多数东西.什么是有效的实现方法?
byte bitset[]
Run Code Online (Sandbox Code Playgroud)
也许
bool bitset[]
Run Code Online (Sandbox Code Playgroud)
?
Mik*_*iak 14
CCAN有一个可以使用的bitset实现:http://ccan.ozlabs.org/info/jbitset.html
但是如果你最终自己实现它(例如,如果你不喜欢该包的依赖项),你应该使用一个int数组并使用计算机体系结构的原生大小:
#define WORD_BITS (8 * sizeof(unsigned int))
unsigned int * bitarray = (int *)calloc(size / 8 + 1, sizeof(unsigned int));
static inline void setIndex(unsigned int * bitarray, size_t idx) {
bitarray[idx / WORD_BITS] |= (1 << (idx % WORD_BITS));
}
Run Code Online (Sandbox Code Playgroud)
不要使用特定大小(例如使用uint64或uint32),让计算机使用它想要使用的内容并使用sizeof来适应它.
小智 10
没有人提到C FAQ推荐的内容,这是一堆好老的宏:
#include <limits.h> /* for CHAR_BIT */
#define BITMASK(b) (1 << ((b) % CHAR_BIT))
#define BITSLOT(b) ((b) / CHAR_BIT)
#define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b))
#define BITCLEAR(a, b) ((a)[BITSLOT(b)] &= ~BITMASK(b))
#define BITTEST(a, b) ((a)[BITSLOT(b)] & BITMASK(b))
#define BITNSLOTS(nb) ((nb + CHAR_BIT - 1) / CHAR_BIT)
Run Code Online (Sandbox Code Playgroud)
(通过http://c-faq.com/misc/bitsets.html)
归档时间: |
|
查看次数: |
24295 次 |
最近记录: |