BitSet的用法

1,BitSet类
    大小可动态改变, 取值为true或false的位集合。用于表示一组布尔标志。

此类实现了一个按需增长的位向量。位 set 的每个组件都有一个 boolean 值。用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容。

默认情况下,set 中所有位的初始值都是 false。

每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数。注意,这个大小与位 set 的实现有关,所以它可能随实现的不同而更改。位 set 的长度与位 set 的逻辑长度有关,并且是与实现无关而定义的。

除非另行说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException。 在没有外部同步的情况下,多个线程操作一个 BitSet 是不安全的。

2,构造函数: BitSet() or BitSet(int nbits)

3,方法:

public void set(int pos): 位置pos的字位设置为true。 
public void set(int bitIndex, boolean value) 将指定索引处的位设置为指定的值。 
public void clear(int pos): 位置pos的字位设置为false。
public void clear() : 将此 BitSet 中的所有位设置为 false。 
public int cardinality() 返回此 BitSet 中设置为 true 的位数。 
public boolean get(int pos): 返回位置是pos的字位值。 
public void and(BitSet other): other同该字位集进行与操作,结果作为该字位集的新值。 
public void or(BitSet other): other同该字位集进行或操作,结果作为该字位集的新值。 
public void xor(BitSet other): other同该字位集进行异或操作,结果作为该字位集的新值。
public void andNot(BitSet set) 清除此 BitSet 中所有的位,set - 用来屏蔽此 BitSet 的 BitSet
public int size(): 返回此 BitSet 表示位值时实际使用空间的位数。
public int length() 返回此 BitSet 的“逻辑大小”:BitSet 中最高设置位的索引加 1。 
public int hashCode(): 返回该集合Hash 码, 这个码同集合中的字位值有关。 
public boolean equals(Object other): 如果other中的字位同集合中的字位相同,返回true。 
public Object clone() 克隆此 BitSet,生成一个与之相等的新 BitSet。 
public String toString() 返回此位 set 的字符串表示形式。

例1:标明一个字符串中用了哪些字符

import java.util.BitSet;
public class WhichChars{
   private BitSet used = new BitSet();
   public WhichChars(String str){
      for(int i=0;i< str.length();i++)
        used.set(str.charAt(i));  // set bit for char
   }
    public String toString(){
         String desc="[";
         int size=used.size();
          for(int i=0;i< size;i++){
             if(used.get(i))
                 desc+=(char)i;
            }
             return desc+"]";
         }
    public static void main(String args[]){
        WhichChars w=new WhichChars("How do you do");
        System.out.println(w);
    }
   }

运行:
C:\work>java WhichChars

[ Hdouwy]

4

java.util.BitSet可以按位存储。
计算机中一个字节(byte)占8位(bit),我们java中数据至少按字节存储的,
比如一个int占4个字节。
如果遇到大的数据量,这样必然会需要很大存储空间和内存。
如何减少数据占用存储空间和内存可以用算法解决。
java.util.BitSet就提供了这样的算法。
比如有一堆数字,需要存储,source=[3,5,6,9]
用int就需要4*4个字节。
java.util.BitSet可以存true/false。
如果用java.util.BitSet,则会少很多,其原理是:
1,先找出数据中最大值maxvalue=9
2,声明一个BitSet bs,它的size是maxvalue+1=10
3,遍历数据source,bs[source[i]]设置成true.
最后的值是:
(0为false;1为true)
bs [0,0,0,1,0,1,1,0,0,1]
                3,   5,6,       9

这样一个本来要int型需要占4字节共32位的数字现在只用了1位!
比例32:1  
这样就省下了很大空间。

例子:

package com;  

import java.util.BitSet;  

public class MainTestThree {  

    /**
     * @param args
     */
    public static void main(String[] args) {
        BitSet bm=new BitSet();
        System.out.println(bm.isEmpty()+"--"+bm.size());
        bm.set(0);
        System.out.println(bm.isEmpty()+"--"+bm.size());
        bm.set(1);
        System.out.println(bm.isEmpty()+"--"+bm.size());
        System.out.println(bm.get(65));
        System.out.println(bm.isEmpty()+"--"+bm.size());
        bm.set(65);
        System.out.println(bm.isEmpty()+"--"+bm.size());
    }  

}  

输出:
 true--64
false--64
false--64
false
false--64
false--128

例子2:

package com;  

import java.util.BitSet;  

public class MainTestFive {  

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] shu={2,42,5,6,6,18,33,15,25,31,28,37};
        BitSet bm1=new BitSet(MainTestFive.getMaxValue(shu));
        System.out.println("bm1.size()--"+bm1.size());  

        MainTestFive.putValueIntoBitSet(shu, bm1);
        printBitSet(bm1);
    }  

    //初始全部为false,这个你可以不用,因为默认都是false
    public static void initBitSet(BitSet bs){
        for(int i=0;i<bs.size();i++){
            bs.set(i, false);
        }
    }
    //打印
    public static void printBitSet(BitSet bs){
        StringBuffer buf=new StringBuffer();
        buf.append("[\n");
        for(int i=0;i<bs.size();i++){
            if(i<bs.size()-1){
                buf.append(MainTestFive.getBitTo10(bs.get(i))+",");
            }else{
                buf.append(MainTestFive.getBitTo10(bs.get(i)));
            }
            if((i+1)%8==0&&i!=0){
                buf.append("\n");
            }
        }
        buf.append("]");
        System.out.println(buf.toString());
    }
    //找出数据集合最大值
    public static int getMaxValue(int[] zu){
        int temp=0;
        temp=zu[0];
        for(int i=0;i<zu.length;i++){
            if(temp<zu[i]){
                temp=zu[i];
            }
        }
        System.out.println("maxvalue:"+temp);
        return temp;
    }
    //放值
    public static void putValueIntoBitSet(int[] shu,BitSet bs){
        for(int i=0;i<shu.length;i++){
            bs.set(shu[i], true);
        }
    }
    //true,false换成1,0为了好看
    public static String getBitTo10(boolean flag){
        String a="";
        if(flag==true){
            return "1";
        }else{
            return "0";
        }
    }  

}  

输出:

maxvalue:42
bm1.size()--64
[
0,0,1,0,0,1,1,0,
0,0,0,0,0,0,0,1,
0,0,1,0,0,0,0,0,
0,1,0,0,1,0,0,1,
0,1,0,0,0,1,0,0,
0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
]

这样便完成了存值和取值。
注意它会对重复的数字过滤,就是说,一个数字出现过超过2次的它都记成1。
出现的次数这个信息就丢了。

BitSet的用法

时间: 2024-08-06 02:38:33

BitSet的用法的相关文章

[HDOJ5890]Eighty seven(暴力,dp,bitset)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5890 题意:50个数,10W个询问,每次问删掉第i,j,k个数后,是否存在一种选10个数和为87的方案,只需要输出 ’Yes’ 或者 ’No’ 题解:暴力:不同的询问大概2W个,每个暴力bitset DP,抠一抠能卡着过.优化1:先求出一组解,如果询问和解没交就是’Yes’,否则暴力,不同的询问大概1W个:优化2:先预处理出所有询问的答案,能方便的复用之前的DP数组,不用每次从头开始重新求. 学了一

关于bitset

我们先来看一道题: 给你一个长度为n的数列(n <= 1e5) 3 种操作 查询某区间内不同种类数的个数(在 %2018 意义下) 将某区间内所有数变为k 将某区间内所有数+k SOL : 维护区间?线段树? 线段树能维护什么? 和? 最值? 或? 对!就是或! 我们先建一棵线段树,假设每个节点维护的信息是一个2018位的二进制数a 那么叶子节点的a中只有一位是1 非叶子节点的a就是其左右子树取或后的结果 (想想为什么?) 那怎么维护这个2018位的二进制数呢? 一个很显然的方法是开一个bool

Bipartite Graph hdu 5313 bitset 并查集 二分图

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5313 题意: 给出n个顶点,m条边,问最多添加多少条边使之构成一个完全二分图 存储结构: bitset     [用法详情:http://blog.csdn.net/piaocoder/article/details/47177891] 用时:624ms 思路: 二分图的总边数即:n*m(假设一个有n个点,另一个有m个点) 题目是给出总共的点数为n,间接求最大的边数 想到一个小学题:给出长度为n的绳子,

【STL】NYOJ 412 Same binary weight (bitset)

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=412 Same binary weight 时间限制:300 ms  |  内存限制:65535 KB 难度:3 描述  The binary weight of a positive  integer is the number of 1's in its binary representation.for example,the decmial number 1 has a b

Oleg and Little Ponies

Oleg and Little Ponies Time limit: 0.9 secondMemory limit: 64 MB Little boy Oleg loves the cartoon My Little Pony. How it cannot be loved, because there is friendship, magic and colored horses! For the past several months Oleg has been begging from h

筛选素数空间压缩(数论)&amp;&amp; Double Happiness

113 C. Double Happiness 题目链接: Click Here~ 先介绍bitset<>的用法: <用别人有现成> #include<bister> using std::bitset; 一句话定义:可自定义位数,用作记录二进制的数据类型. 一,定义和初始化 bitset<n> b;                           //b有n位,每位都为0; bitset<n> b(u);                  

穷竭搜索: POJ 2718 Smallest Difference

题目:http://poj.org/problem?id=2718 题意: 就是输入N组数据,一组数据为,类似 [1  4  5  6  8  9]这样在0~9之间升序输入的数据,然后从这些数据中切一刀,比如  n1:[1 4 5],n2:[6 8 9]这样,然后 abs(n1- n2),对n1 和 n2的所有可能的排列 n1: [1 4 5][1 5 4]...这样,要算出来的最小的差,显然从中间切一刀才会出现这种解. 题解: 这里可以用来练习 STL,算法不会也没有关系,可以在这题学到 bi

富豪凯匹配串

bitset的用法:https://www.cnblogs.com/magisk/p/8809922.html https://blog.csdn.net/caipengbenren/article/details/90443961 例题汇总 https://blog.csdn.net/weixin_38686780/article/details/89377729 连接:富豪凯匹配串 题解:根据与运算的特点,只有为两个1时为1,否则为0.根据题意当‘_’遇到0/1时都是匹配成功的,我们不妨把'

Bitset 用法(STL)

std::bitset是STL的一个模板类,它的参数是整形的数值,使用位的方式和数组区别不大,相当于只能存一个位的数组.下面看一个例子 [cpp] view plaincopy bitset<20> b1(5); cout<<"the set bits in bitset<5> b1(5) is:" << b1 <<endl; 结果是   the set bits in bitset<5> b1(5) is:000