`

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用法 bitset用法

    ### Bitset用法详解 在C++编程语言中,`bitset`是一个非常有用的类模板,它可以帮助程序员高效地处理二进制数据。`bitset`的主要功能是存储位序列,并提供了丰富的成员函数来对这些位进行操作。下面我们将详细介绍`...

    动态Bitset源代码

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

    C语言头文件 BITSET

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

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

    Java的BitSet是一个实用工具类,它提供了位操作的功能,常用于存储一组可变的布尔值。在多线程并发环境中,对BitSet的操作需要特别注意,因为位操作本身是原子性的,但BitSet的大部分方法并不是线程安全的。这篇博文...

    Go-bitset-Go包实现bitsets

    在Go编程语言中,`bitset`是一个非常实用的包,用于高效地处理位集(也称为位向量或位数组)。位集是一种特殊的数据结构,它使用二进制位来表示一系列布尔值,通常用于存储有限集合的成员资格。Go的`bitset`包实现了...

    c++ bitset实现

    `C++ bitset` 是一个内置的类型,用于在内存中高效存储和操作位序列。在C++标准库中,`&lt;bitset&gt;` 头文件提供了`std::bitset` 类模板,它允许我们创建一个固定大小的位集合,类似于二进制数。然而,题目中的描述表明...

    可以动态扩展的bitset

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

    dm-bitset.rar_thin

    This bitset type is a thin wrapper round a dm_array of 64bit words.This bitset type is a thin wrapper round a dm_array of 64bit words.

    BitSet 源码分析.txt

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

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

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

    java 原生包 BitSet 源码

    Java中BitSet类是Java集合框架的一部分,它是一种用于处理位操作的高级数据结构。BitSet可以看作是一个只存储布尔值的数组,但相比于原始的布尔数组,BitSet更加内存高效,因为它以64位的块(word)来存储多个布尔值...

    C++下bitset简介

    C++中的`bitset`是一个非常实用的容器,它允许我们以数组的形式操作位,从而方便地处理位级别的逻辑运算。`bitset`是C++标准库的一部分,属于STL(Standard Template Library),它提供了高效且易用的方法来管理一组...

    大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!

    《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能! https://lenyiin.blog.csdn.net/article/details/142710211 这篇博客所涉及的所有完整代码 。本篇博客深入探讨了 C++ ...

    前端项目-bitset.js.zip

    《前端项目:深入理解bitset.js库》 在前端开发中,高效的数据结构和算法是提升应用性能的关键。其中,bitset是一种特殊的数据结构,它在内存中以二进制位的形式存储数据,常用于大规模布尔值的高效管理。本文将...

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

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

    开源项目-xojoc-bitset.zip

    开源项目-xojoc-bitset.zip是一个专注于位集数据结构的开源项目,名为bitset-master。位集,也称为位向量或位数组,是计算机科学中一种高效的数据结构,用于存储和操作二进制位。在许多算法和数据处理场景中,位集因...

    问题 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编程中的HashSet和BitSet详解

    Java编程中的HashSet和BitSet详解 HashSet和BitSet是Java编程中两个常用的集合类,它们都可以用来存储大量的数据,但它们之间有着明显的差异。那么,为什么Apache Commons作者选择使用BitSet代替HashSet呢?在本文...

Global site tag (gtag.js) - Google Analytics