精华内容
下载资源
问答
  • 详解C++ bitset用法

    2021-01-01 07:39:01
    C++的 bitsetbitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bitset<4> bitset1; //无参构造,...
  • std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位。 #include using std::bitset; 一句...
  • 我们要使用bitset,首先需要包含头文件bitset。和vector对象不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset的时候,要明确bitset包含了多少位,须在尖括号内给出它的长度值。长度值必须定义为...
  • 下面小编就为大家带来一篇基于C++ bitset常用函数及运算符(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了浅谈Java BitSet使用场景和代码示例,具有一定借鉴价值,需要的朋友可以参考下。
  • bitset源码Java 这是 Java Bitset 类的字对齐压缩变体。 我们提供 64 位和 32 位类似 RLE 的压缩方案。 它可用于实现位图索引。 它所依赖的 EWAH 格式用于运行 GitHub 的 git 实现。 字对齐压缩的目标不是实现最佳...
  • 认识C++中的bitset类型

    2020-12-22 23:10:24
    认识标准库bitset类型  位是用来保存一组项或者条件的yes/no(1或者0)信息的一种简洁方法,那么位集是二进制位的有序集。C++中标准库提供的bitset类在我们程序中很有效的简化了对于位集的处理。  bitset对象的...
  • FastBitSet.js:速度优化的BitSet实现 当存储的值是相当小的整数时,BitSet(也称为Bitmap或位向量)是实现一组的理想数据结构。 它可能比通用集实现快几个数量级。 特别是,BitSet具有对设置操作(联合,差,交)...
  • bitset 一般代替 bool 数组使用,常用于优化空间,因为 bitset 中一个元素只占 1 bit。 bitset 的大小在定义使就需要确定。如果想要不定长的 bitset,就需要使用 vector。 bitset 的定义: bitset<16> bt; // 定义...
  • NULL 博文链接:https://huangyunbin.iteye.com/blog/2194731
  • bitset源码 Awesome Go 中文翻译 awesome Go项目的中文翻译,原文请点击 . 贡献 首先请看一下这个 。同时感谢这些 。 you rock! 如果你看到下面的某个项目已经不再被支持或者并不适用,请提交一个pull request建议来...
  • 动态Bitset源代码

    2017-09-30 17:20:09
    在C++的STL中实现由一个bitset类模板,其用法如下: std::bitset<64> bs; 也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。 /*...
  • RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...
  • bitset

    2018-07-30 22:06:15
    C++ bitset 高端压位卡常题必备STL(好吊的一句话) bitset存储二进制数位。 bitset就像一个bool类型的数组一样,但是有空间优化—bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一。 ...

    C++ bitset 高端压位卡常题必备STL(好吊的一句话)

    bitset存储二进制数位。

    bitset就像一个bool类型的数组一样,但是有空间优化—bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一。

    bitset中的每个元素都能单独被访问,例如对于一个叫做foo的bitset,表达式foo[3]访问了它的第4个元素,就像数组一样。

    bitset有一个特性:整数类型和布尔数组都能转化成bitset。

    bitset的大小在编译时就需要确定。如果你想要不确定长度的bitset,请使用(奇葩的)vector<bool>。

    bitset可以看作bool数组,不但优化了空间复杂度和时间复杂度,并且可以像整形一样按位与或。

    #include<bits/stdc++.h>
    
    
    #include<bitset>
    using std::bitset;
    using namespace std;
    int main ()
    {
        ///bitset的定义
        bitset<16> bi;
        bitset<16> bar (0xfa2);
        bitset<16> baz (string("0101111001"));
    
        cout << "bi: " << bi <<endl;
        cout << "bar: " << bar <<endl;
        cout << "baz: " << baz <<endl;
    
        ///bitset的运算
        ///像一个普通的整数一样,可以进行与(&)、或(|)、异或(^)、左移(<<)、右移(>>)等操作。
        bitset<4> bi (string("1001"));
        bitset<4> bar (string("0011"));
    
        cout << (bi^=bar) <<endl;       // 1010 (XOR,assign)
        cout << (bi&=bar) <<endl;       // 0010 (AND,assign)
        cout << (bi|=bar) <<endl;       // 0011 (OR,assign)
    
        cout << (bi<<=2) <<endl;        // 1100 (SHL,assign)
        cout << (bi>>=1) <<endl;        // 0110 (SHR,assign)
    
        cout << (~bar) <<endl;           // 1100 (NOT)
        cout << (bar<<1) <<endl;         // 0110 (SHL)
        cout << (bar>>1) <<endl;         // 0001 (SHR)
    
        cout << (bi==bar) <<endl;       // false (0110==0011)
        cout << (bi!=bar) <<endl;       // true  (0110!=0011)
    
        cout << (bi&bar) <<endl;        // 0010
        cout << (bi|bar) <<endl;        // 0111
        cout << (bi^bar) <<endl;        // 0101
    
    
        ///赋值
        ///bitset重载了[]运算符,故可以像bool数组那样赋值
    
        bi[2] = 1;//这样就能将第二位赋值为1
        cout<<bi[2]<<endl;
    
    
        ///相关函数
        对于一个叫做bi的bitset:
        bi.size() 返回大小(位数)
        bi.count() 返回1的个数
        bi.any() 返回是否有1
        bi.none() 返回是否没有1
        bi.set() 全都变成1
        bi.set(p) 将第p + 1位变成1
        bi.set(p, x) 将第p + 1位变成x
        bi.reset() 全都变成0
        bi.reset(p) 将第p + 1位变成0
        bi.flip() 全都取反
        bi.flip(p) 将第p + 1位取反
        bi.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
        bi.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
        bi.to_string() 返回它转换为string的结果
    
        return 0;
    }
    

     

    展开全文
  • 主要介绍了Java编程中的HashSet和BitSet详解的相关资料,需要的朋友可以参考下
  • bitset 源码 array-tree-table 使用二维数组实现的并且可用于排序的表格(Table), 支持json的序列化和反序列化 参考Table定义: 实现目标 查找 按行,按列,快速定位(guava中的table实现不能满足此要求) 快速迭代,按行,...
  • BitSet

    2018-12-04 11:16:00
    Bitset类 一个Bitset类创建一种特殊类型的数组来保存值。BitSet中数组大小会随需要增加。这和位向量比较类似。 Java平台的BitSet用于存放一个位序列,如果要高效的存放一个位序列,就可以使用位集(BitSet)。由于位...

    Bitset类

    一个Bitset类创建一种特殊类型的数组来保存值。BitSet中数组大小会随需要增加。这和位向量比较类似。
    Java平台的BitSet用于存放一个位序列,如果要高效的存放一个位序列,就可以使用位集(BitSet)。由于位集将位包装在字节里,所以使用位集比使用Boolean对象的List更加高效和更加节省存储空间。
    BitSet是位操作的对象,值只有0或1即false和true,内部维护了一个long数组,初始只有一个long,所以BitSet最小的size是64,当随着存储的元素越来越多,BitSet内部会动态扩充,一次扩充64位,最终内部是由N个long来存储。
    默认情况下,BitSet的所有位都是false即0。
    在没有外部同步的情况下,多个线程操作一个BitSet是不安全的。
    一个1GB的空间,有8102410241024 = 8.5810^9bit,也就是1GB的空间可以表示85亿多个数。

    • 比如,一个BitSet是怎么存储数字0,2,4,6,8,10,12,14呢?
    对应值01234567891011121314
    101010101010101
    BitSet()

    第二个方法允许用户指定初始化大小。所有位初始化位0

    BitSet(int size)
    • void and(BitSet set)

      对此目标位 set 和参数位 set 执行逻辑与操作。

    • void andNot(BitSet set)

      清除此 BitSet 中所有的位,其相应的位在指定的 BitSet 中已设置。

    • int cardinality( )

      返回此 BitSet 中设置为 true 的位数。

    • void clear( )

      将此 BitSet 中的所有位设置为 false。

    • void clear(int index)

      将索引指定处的位设置为 false。

    • void clear(int startIndex, int endIndex)

      将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的位设置为 false。

    • Object clone( )

      复制此 BitSet,生成一个与之相等的新 BitSet。

    • boolean equals(Object bitSet)

      将此对象与指定的对象进行比较。

    • void flip(int index)

      将指定索引处的位设置为其当前值的补码。

    • void flip(int startIndex, int endIndex)

      将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的每个位设置为其当前值的补码。

    • boolean get(int index)

      返回指定索引处的位值。

    • BitSet get(int startIndex, int endIndex)

      返回一个新的 BitSet,它由此 BitSet 中从 fromIndex(包括)到 toIndex(不包括)范围内的位组成。

    • int hashCode( )

      返回此位 set 的哈希码值。

    • boolean intersects(BitSet bitSet)

      如果指定的 BitSet 中有设置为 true 的位,并且在此 BitSet 中也将其设置为 true,则返回 true。

    • boolean isEmpty( )

      如果此 BitSet 中没有包含任何设置为 true 的位,则返回 true。

    • int length( )

      返回此 BitSet 的"逻辑大小":BitSet 中最高设置位的索引加 1。

    • int nextClearBit(int startIndex)

      返回第一个设置为 false 的位的索引,这发生在指定的起始索引或之后的索引上。

    • int nextSetBit(int startIndex)

      返回第一个设置为 true 的位的索引,这发生在指定的起始索引或之后的索引上。

    • void or(BitSet bitSet)

      对此位 set 和位 set 参数执行逻辑或操作。

    • void set(int index)

      将指定索引处的位设置为 true。

    • void set(int index, boolean v)

      将指定索引处的位设置为指定的值。

    • void set(int startIndex, int endIndex)

      将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的位设置为 true。

    • void set(int startIndex, int endIndex, boolean v)

      将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的位设置为指定的值。

    • int size( )

      返回此 BitSet 表示位值时实际使用空间的位数。

    • String toString( )

      返回此位 set 的字符串表示形式。

    • void xor(BitSet bitSet)

      对此位 set 和位 set 参数执行逻辑异或操作。

    package com.java1995;
    
    import java.util.BitSet;
    
    public class BitSetTest {
        public static void main(String[] args){
            BitSet bits1 = new BitSet(16);
            BitSet bits2 = new BitSet(16);
    
            for (int i = 0;i < 16;i++){
                if ((i%2)==0)bits1.set(i);
                if ((i%5)!=0)bits2.set(i);
            }
    
            System.out.println("Initial pattern in bits1:");
            System.out.println(bits1);
            System.out.println("Initial pattern in bits2:");
            System.out.println(bits2);
    
            bits2.and(bits1);
            System.out.println("bits2 and bits1:");
            System.out.println(bits2);
    
            bits2.or(bits1);
            System.out.println("bits2 or bits1:");
            System.out.println(bits2);
    
            bits2.xor(bits1);
            System.out.println("bits2 xor bits1:");
            System.out.println(bits2);
        }
    }

    1450028-20181204111554307-411340380.png

    应用场景

    • 统计一组大数据中没有出现过的数

      将这组数据映射到BitSet,然后便利BitSet,对应位位0的数表示没有出现过的数据。

    • 对大数据进行排序

      将数据映射到BitSet,遍历BitSet得到的就是有序数据

    • 在内存对大数据进行压缩存储等等

    1GB的内容空间可以存储85亿多个数,可以有效实现数据的压缩存储,节省内存开销

    为什么BitSet使用long数组做内部存储?

    JDK选择long数组作为BitSet的内部存储结构是出于性能的考虑,因为BitSet提供and和or这种操作,需要对两个BitSet中的所有bit位做and或者or,实现的时候需要遍历所有的数组元素。使用long能够使得循环的次数降到最低,所以Java选择使用long数组作为BitSet的内部存储结构。
        从数据在栈上的存储来说,使用long和byte基本是没有什么差别的,除了编译器强制地址对齐的时候,使用byte最多会浪费7个字节(强制按照8的倍数做地址对其),另外从内存读数组元素的时候,也是没有什么区别的,因为汇编指令有对不同长度数据的mov指令。所以说,JDK选择使用long数组作为BitSet的内部存储结构的根本原因就是在and和or的时候减少循环次数,提高性能。
        例如我们进行BitSet中的and, or,xor操作时,要对整个bitset中的bit都进行操作,需要依次读出bitset中所有的word,如果是long数组存储,我们可以每次读入64个bit,而int数组存储时,只能每次读入32个bit。另外我们在查找bitset中下一个置为1的bit时,word首先会和0进行比较,如果word的值为0,则表示该word中没有为1的bit,可以忽略这个word,如果是long数组存储,可以一次跳过64个bit,如果是int数组存储时,一次只能跳过32个bit。

    转载于:https://www.cnblogs.com/wangbobobobo/p/10062991.html

    展开全文
  • BitSet 源码分析.txt

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,079
精华内容 28,031
关键字:

bitset