码迷,mamicode.com
首页 > 编程语言 > 详细

比特数组

时间:2014-10-15 18:11:41      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   使用   ar   sp   div   

  1 class BitArray
  2 {
  3 public:
  4     enum
  5     {
  6         bits_per_long = sizeof(unsigned long)*8,
  7     };
  8     
  9     BitArray(): array_(0) { }
 10     BitArray(unsigned long nr): array_(0)
 11     {
 12         reset(nr);
 13     }
 14 
 15     ~BitArray() { if (array_) delete [] array_; }
 16 
 17     BitArray(const BitArray& rhs)
 18     {
 19         if (rhs.array_)
 20         {
 21             array_ = new unsigned long[rhs.nr_long_];
 22             memcpy(array_, rhs.array_, rhs.nr_long_ * sizeof(unsigned long));
 23             nr_long_ = rhs.nr_long_;
 24             nr_bits_ = rhs.nr_bits_;
 25         }
 26     }
 27 
 28     BitArray& operator=(const BitArray& rhs)
 29     {
 30         if (this == &rhs)
 31         {
 32             return *this;
 33         }
 34 
 35         if (array_)
 36         {
 37             delete [] array_;
 38         }
 39             
 40         if (rhs.array_)
 41         {
 42             array_ = new unsigned long[rhs.nr_long_];
 43             memcpy(array_, rhs.array_, rhs.nr_long_ * sizeof(unsigned long));
 44             nr_long_ = rhs.nr_long_;
 45             nr_bits_ = rhs.nr_bits_;
 46         }
 47         return *this;
 48     }
 49 
 50     bool operator[](std::size_t nr)
 51     {
 52         if (nr >= nr_bits_)
 53             return false;
 54 
 55         unsigned long ret = array_[bitWord(nr)] & bitMask(nr);
 56         if (ret)
 57             return true;
 58         else
 59             return false;            
 60     }
 61 
 62     bool testBit(std::size_t nr)
 63     {
 64         return this->operator[](nr);
 65     }
 66 
 67     void setBit(unsigned long nr)
 68     {
 69         if (nr >= nr_bits_)
 70         {
 71             return;
 72         }
 73 
 74         array_[bitWord(nr)] |= bitMask(nr);
 75     }
 76     
 77     void clearBit(unsigned long nr)
 78     {
 79         if (nr >= nr_bits_)
 80         {
 81             return;
 82         }
 83 
 84         array_[bitWord(nr)] &= ~bitMask(nr);
 85     }
 86 
 87     void reset(unsigned long nr_bits)
 88     {
 89         if (array_)
 90         {
 91             delete [] array_;
 92         }
 93 
 94         unsigned long real_nr_bits = align(nr_bits);
 95         nr_long_ = getNrLong(real_nr_bits);
 96         array_ = new unsigned long[nr_long_];
 97         nr_bits_ = nr_bits;
 98         memset(array_, 0, nr_long_*sizeof(unsigned long));
 99     }
100 
101 private:
102 
103     unsigned long getNrLong(unsigned long nr) { return nr/bits_per_long; }
104     unsigned long align(unsigned long nr)
105     {
106         return (nr + (bits_per_long-1)) & (~(bits_per_long-1));
107     }
108 
109     unsigned long bitWord(unsigned long nr)
110     {
111         return nr/bits_per_long;
112     }
113     
114     unsigned long bitMask(unsigned long nr)
115     {
116         return nr%bits_per_long;
117     }
118 
119     unsigned long nr_bits_;
120     unsigned long nr_long_;
121     unsigned long * array_;
122 };

使用如下,

#include <iostream>
#include <string>
#include <string.h>
#include "BitArray.h"

int main(void)
{
    BitArray a(10);
    a.setBit(1);
    cout << a[1] << endl;
    a.clearBit(1);
    cout << a[1] << endl;

    a.setBit(10);
    cout << a[10] << endl;
    
    return 0;
}

 

比特数组

标签:style   blog   color   io   os   使用   ar   sp   div   

原文地址:http://www.cnblogs.com/wendellyi/p/4026621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!