zoukankan      html  css  js  c++  java
  • 如何实现简单的位数组(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 10000
    
    int main()
    {
        char bitarray[BITNSLOTS(MAX)];
        int i, j;
    
        memset(bitarray, 0, BITNSLOTS(MAX));
    
        for(i = 2; i < MAX; i++) {
            if(!BITTEST(bitarray, i)) {
                printf("%d\n", i);
                for(j = i + i; j < MAX; j += i)
                    BITSET(bitarray, j);
            }
        }
        return 0;
    }

    (完)

  • 相关阅读:
    NOI2005维修数列
    BZOJ1208 [HNOI2004]宠物收养所
    BZOJ3223 文艺平衡树
    BZOJ [JSOI2008]星球大战starwar
    BZOJ1013 [JSOI2008]球形空间产生器sphere
    小程序之底部tabBar
    es6
    vue.js安装
    模块打包工具webpack
    highchart
  • 原文地址:https://www.cnblogs.com/haippy/p/3102630.html
Copyright © 2011-2022 走看看