`

bitset

阅读更多
bitSet.h
#ifndef BITSET_H
#define BITSET_H

#include<assert.h>
#include<iostream>
using namespace std;

const int DefaultSize=50;
/*
  16位无符号短整数实现位映射
  */
template<typename T>
class bitSet{
public:
    bitSet(int sz=DefaultSize);
    bitSet(const bitSet<T>& R);
    ~bitSet(){
        delete []bitVector;
    }
    void makeEmpty(){
        for(int i=0;i<vectorSize;i++)
            bitVector[i]=0;
    }
    unsigned short getMember(const T x);
        void putMember(const T x,unsigned short v);
    bool addMember(const T x);
    bool delMember(const T x);
    bitSet<T>& operator=(const bitSet<T>& R);
    bitSet<T>& operator+(const bitSet<T>& R);
    bitSet<T>& operator*(const bitSet<T>& R);
    bitSet<T>& operator-(const bitSet<T>& R);
    bool Contains(const T x);
    bool subSet(bitSet<T>& R);
    bool operator==(bitSet<T>& R);
    friend istream& operator>>(istream& in,bitSet<T>& R);
    friend ostream& operator<<(ostream& out,bitSet<T>& R){
        for(int i=0;i<R.setSize;i++){
            out << R.bitVector[i] << ",";
        }
        out << endl;
        return out;
    }

private:
    int setSize;
    int vectorSize;
    unsigned short *bitVector;
};

#endif // BITSET_H


bitSet.cpp
#include"bitSet.h"
#include<iostream>
using namespace std;

template<typename T>
bitSet<T>::bitSet(int sz):setSize(sz)
{
    assert(setSize>0);
    vectorSize = (setSize+15)>>4;
    bitVector = new unsigned short[vectorSize];
    assert(bitVector!=NULL);
    for(int i=0;i<vectorSize;++i)
        bitVector[i]=0;
}

template<typename T>
bitSet<T>::bitSet(const bitSet<T> &R)
{
    setSize=R.setSize;
    vectorSize=R.vectorSize;
    bitVector = new unsigned short[vectorSize];
    for(int i=0;i<R.vecterSize;++i){
        bitVector[i]=R.bitVector[i];
    }
    assert(bitVector!=NULL);
}

/*
  获得集合元素x在bitVector中相应位置的值
  */
template<typename T>
unsigned short bitSet<T>::getMember(const T x)
{
    int ad=x/16,id=x%16;
    unsigned short elem=bitVector[ad];
    return ((elem>>(15-id))%2);
}

template<typename T>
void bitSet<T>::putMember(const T x,unsigned short v)
{
    int ad=x/16,id=x%16;
    unsigned short elem=bitVector[ad];
    unsigned short temp=elem>>(15-id);
    elem=elem<<(id+1);
    if(temp%2==0&&v==1)
        temp+=1;
    else if(temp%2==1&&v==0)
        temp-=1;
    bitVector[ad]=(temp<<(15-id))|(elem>>(id+1));
}

template<typename T>
bool bitSet<T>::addMember(const T x)
{
    assert(x>=0&&x<setSize);
    if(getMember(x)==0){
        putMember(x,0);
        return true;
    }
    return false;
}

template<typename T>
bitSet<T>& bitSet<T>::operator+(const bitSet<T>& R)
{
    assert(vectorSize==R.vecterSize);
    bitSet temp(vectorSize);
    for(int i=0;i<vectorSize;++i){
        temp.bitVector[i]=bitVector[i]|R.bitVector[i];
    }
    return temp;
}

template<typename T>
bitSet<T>& bitSet<T>::operator*(const bitSet<T>& R)
{
    assert(vectorSize==R.vecterSize);
    bitSet temp(vectorSize);
    for(int i=0;i<vectorSize;++i){
        temp.bitVector[i]=bitVector[i]&R.bitVector[i];
    }
    return temp;
}

template<typename T>
bitSet<T>& bitSet<T>::operator-(const bitSet<T>& R)
{
    assert(vectorSize==R.vecterSize);
    bitSet temp(vectorSize);
    for(int i=0;i<vectorSize;++i){
        temp.bitVector[i]=bitVector[i]&!R.bitVector[i];
    }
    return temp;
}

template<typename T>
bool bitSet<T>::Contains(const T x)
{
    assert(x>=0&&x<=setSize);
    return getMemeber(x)==1?true:false;
}

template<typename T>
bool bitSet<T>::subSet(bitSet<T> &R)
{
    assert(setSize==R.setSize);
    for(int i=0;i<vectorSize;++i){
        if(bitVector[i]&!R.bitVector[i])
            return false;
    }
    return true;
}

template<typename T>
bool bitSet<T>::operator==(bitSet<T>& R)
{
    assert(setSize==R.setSize);
    for(int i=0;i<setSize;++i){
        if(bitVector[i]!=R.bitVector[i])
            return false;
    }
    return true;
}


分享到:
评论

相关推荐

    动态Bitset源代码

    在C++的STL中实现由一个bitset类模板,其用法如下: std::bitset&lt;64&gt; bs; 也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。 /*...

    bitset用法 bitset用法

    bitset用法bitset用法bitset用法bitset用法bitset用法bitset用法

    C语言头文件 BITSET

    C语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC...

    acm相关资料vector、bitset

    acm相关资料vector、bitset、大数乘法等等

    可以动态扩展的bitset

    文档模仿STL库的BITSET写的一个bitset,但是和STL不同的是这个类是一个可以动态扩展的,使用方法和STL的类似,可以参考STL使用

    Go-bitset-Go包实现bitsets

    bitset - Go包实现 bitsets

    BitSet 源码分析.txt

    基于JDK1.8的BitSet 源码分析, 描述了实现的原理 个方法的含义 虽然没有写出实际的测试代码 但是只要是细度了我的这个分析 在使用的时候就不是问题了

    RoaringBitmap, 在Java中,一个更好的压缩 bitset.zip

    RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...

    c++ bitset实现

    自己实现的bitset数据结构,在vs2005下编译通过。有测试成素。

    c++遗传算法,用bitset实现

    使用C++编写的遗传算法,代码量200行左右,供大家学习研究,互相交流。

    问题 B: Bitset I - Bit Operation I

    Bit Operation I 10進数で与えられた非負の整数xを2進数に変換し、32桁のビット列bとして出力してください。さらに、bに対して以下の処理をそれぞれ行ったビット列を出力してください。 反転: 全てのビットを反...

    详解C++ bitset用法

    C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bitset&lt;4&gt; bitset1; //无参构造,...

    java 原生包 BitSet 源码

    Java 原生包 BitSet 源码,0~3年 Java 工程师必看,属于高级数据结构,利于进阶,面试必备!

    对java的BitSet的多线程并发的探索

    NULL 博文链接:https://huangyunbin.iteye.com/blog/2194731

    java bitset 源码解析.rtf

    java bitset 高级数据结构 源码解析 适合 0-3 年开发人员,进阶、面试必备知识!

    C++下bitset简介

    C++下的bitset,强大而简单的位运算功能,象使用数组一样对位进行操作

    认识C++中的bitset类型

    认识标准库bitset类型  位是用来保存一组项或者条件的yes/no(1或者0)信息的一种简洁方法,那么位集是二进制位的有序集。C++中标准库提供的bitset类在我们程序中很有效的简化了对于位集的处理。  bitset对象的...

    问题 C: Bitset I - Bit Operation II

    10進数で与えられた2つの非負の整数a, bを2進数として扱い、それらのAND(論理積)、OR(論理和)、XOR(排他的論理和)を求め、32桁のビット列として出力してください。

    基于C++ bitset常用函数及运算符(详解)

    C++ bitset——高端压位卡常题必备STL ———————————————————— 以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力。 bitset存储二进制数位。 bitset就像一个bool类型的数组一样,但是有空间...

    java基础之BitSet - 副本.md

    java基础之BitSet - 副本

Global site tag (gtag.js) - Google Analytics