如何实现简单的位数组(bit array)

来源:本站
导读:目前正在解读《如何实现简单的位数组(bit array)》的相关信息,《如何实现简单的位数组(bit array)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《如何实现简单的位数组(bit array)》的详细说明。
简介:在 comp.lang.c 上面看到一则不错的 FAQ,《How can I implement sets or arrays of bits?》感觉很实用,仅仅使用了几个简单的宏就实现了一个基本的位数组(bitset)。

#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)

下面是一些简单的例子:

声明一个固定长度(50个bit)的位数组:

char bitarray[BITNSLOTS(50)];

设置位数组中的某一位:

BITSET(bitarray, 23);

检测某一位

if(BITTEST(bitarray, 35)) ...

求两个位数组的并集

for(i = 0; i < BITNSLOTS(47); i++)   array3[i] = array1[i] | array2[i];

求两个位数组的交集

for(i = 0; i < BITNSLOTS(47); i++)   array3[i] = array1[i] & array2[i];

下面是一个完整的例子,利用Sieve of Eratosthenes算法求素数:

#include <stdio.h>#include <string.h>#define MAX 10000int main(){    char bitarray[BITNSLOTS(MAX)];    int i, j;    memset(bitarray, 0, BITNSLOTS(MAX));    for(i = 2; i < MAX; i++) {        if(!BITTEST(bitarray, i)) {            printf("%dn", i);            for(j = i + i; j < MAX; j += i)                BITSET(bitarray, j);        }    }    return 0;}

提醒:《如何实现简单的位数组(bit array)》最后刷新时间 2024-03-14 01:00:20,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《如何实现简单的位数组(bit array)》该内容的真实性请自行鉴别。