zoukankan      html  css  js  c++  java
  • 比特数组

      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;
    }
  • 相关阅读:
    【转】浮点数与IEEE 754
    最小二乘
    黑科技!两行代码完美解决:同时设置overflow-x:hidden,overflow-y:visible无效的问题
    js过滤html标签
    react native 项目版本升级
    react-native中显示手机本地图片/视频
    SourceTree推送分支时遇到ArgumentException encountered错误的解决办法
    开发自己的react-native组件并发布到npm[转]
    react native 中实现个别页面禁止截屏
    JS数字转中文
  • 原文地址:https://www.cnblogs.com/wendellyi/p/4026621.html
Copyright © 2011-2022 走看看