Java Bitset

Bitset创建一种特殊的数组来保存非负整数的值

取值为true和false,初始都是false。Bitset初始化是一个long,65位,增加位数的话只能是64的整数倍。

如果用一个Bitset存储一组数组【2,4,6,8】,将会是这样的:

找出最大值8,给其加1=9

声明一个Bitset bs[9]

bs[9]=[0,0,1,0,1,0,1,0,1]//数组从第0位到第8位分别代表的是0,1,2,3,4,5,6,7,8,所以bs数组里为1 的就代表有值,为0的就代表没有值

0是false,1是true。

查看BitSet初始化值的代码

package study.stage1;import java.util.BitSet;

/** * Created by Sandy.Liu on 2017/7/11. */public class BitsetTest {    public static void main(String[] args){            BitSet bs1 = new BitSet();            System.out.println("is bs1 empty: "+bs1.isEmpty()+ "   bs1.size: "+bs1.size());            bs1.set(1);        System.out.println("is bs1 empty: "+bs1.isEmpty()+ "  bs1.size: "+bs1.size());        bs1.set(65);        System.out.println("is bs1 empty: "+bs1.isEmpty()+ "  bs1.size: "+bs1.size());

    }}

运行结果

is bs1 empty: true bs1.size: 64
is bs1 empty: false bs1.size: 64
is bs1 empty: false bs1.size: 128

实例2:void and (BitSet set)

package study.stage1;import java.util.BitSet;

/** * Created by Sandy.Liu on 2017/7/11. */public class BitSetTest1 {    public static void main(String[] args){        //初始化两个Bitset        BitSet bs1 = new BitSet();        BitSet bs2 = new BitSet();        //给两个bitset赋值        for(int i = 0;i<30;i++){            if(i%2==0){                bs1.set(i);            }            if(i%5==0){                bs2.set(i);            }        }        System.out.println("bs1: "+bs1);        System.out.println("bs2: "+bs2);

        //bs1 and bs2,值存储在bs1中        bs1.and(bs2);        System.out.println("bs1 and bs2: "+bs1);

    }}运行结果:

bs1: {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28}
bs2: {0, 5, 10, 15, 20, 25}
bs1 and bs2: {0, 10, 20}

分析:

bs1[10101010101010101010101010101]

bs2[100001000010000000001]

所以bs1 and bs2后的值为:【100000000010000000001】,所以就是{0,10,20}

存储的时候会对重复的数字过滤,重复的数字只记一次。

BitSet中实现了Cloneable中的方法如下:

1. void and(BitSet set) 对此目标位和参数位set执行逻辑与操作

2. void andNot(BitSet bet) :

bs1.andNot(bs2)  清除bs1当中存在于bs2中的位。

bs2: {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28}
bs1: {0, 5, 10, 15, 20, 25}

bs1.andNot(bs2): {5,15,25}

3. int cardinality() 返回此BitSet中设置我true的位数

bs1: {0, 5, 10, 15, 20, 25}

bs1.cardinality(): 6

4. void clear() 将所有的位设置为false

5 void clear(int index) 将索引指定的位设置为false

6. void clear(int startIndex, int endIndex) 将startIndex(包括)到endIndex(不包括)之间的位设置为false

7. object clone()复制此BitSet,生成一个相等的新的BitSet。需要注意的是新的BitSet是object类型,赋值给BitSet类型需要强制类型转换

bs1: {0, 5, 10, 15, 20, 25}

bs2

bs2 = (BitSet)bs1.clone();

8. boolean equals(object Bitset) 与指定的对象进行比较

9. boolean getIndex(int index) 返回指定位置处的位值

bs1.getIndex(5): true

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

11. int hashCode( )
返回此位 set 的哈希码值。

12. boolean isEmpty( )
如果此 BitSet 中没有包含任何设置为 true 的位,则返回 ture。

13. int length( )
返回此 BitSet 的"逻辑大小":BitSet 中最高设置位的索引加 1。

bs1: {0, 5, 10, 15, 20, 25}

bs2.length(): 26

14. int size( )
返回此 BitSet 表示位值时实际使用空间的位数。

bs1: {0, 5, 10, 15, 20, 25}

bs2.size(): 64

时间: 2024-11-08 20:52:21

Java Bitset的相关文章

Java BitSet使用场景和示例

一.什么是BitSet? 注:以下内容来自JDK API: BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个boolean值.用非负的整数将BitSet的位编入索引.可以对每个编入索引的位进行测试.设置或者清除.通过逻辑与.逻辑或和逻辑异或操作,可以使用一个 BitSet修改另一个 BitSet的内容. 默认情况下,set 中所有位的初始值都是false. 每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数.注意,这个大小与位 set 的实现有关,所以

Java BitSet(位集)

原理简介: Java平台的BitSet用于存放一个位序列,如果要高效的存放一个位序列,就可以使用位集(BitSet).由于位集将位包装在字节里,所以使用位集比使用Boolean对象的List更加高效和更加节省存储空间. BitSet是位操作的对象,值只有0或1即false和true,内部维护了一个long数组,初始只有一个long,所以BitSet最小的size是64,当随着存储的元素越来越多,BitSet内部会动态扩充,一次扩充64位,最终内部是由N个long来存储. 默认情况下,BitSet

转:一个java教程各章节的链接

Java概述,Java是什么? Java环境变量设置 Java基本语法 Java对象和类 Java基本数据类型 Java变量类型 Java修饰符类型 Java基本运算符 Java循环for, while和do...while Java决策制定 Java Numbers类 Java String类 Java数组 Java日期时间(Date/Time) Java正则表达式 Java方法 Java流,文件和I/O Java异常处理 Java继承 Java覆盖/重载 Java多态性 Java抽象 Jav

日期的压缩存储daybits

问题: 存储一个日期的序列,例如保存用户一年的登录时间序列,20140201,20130102这样两个日期,如果用INT那么需要八个字节,用STRING就更多了. 解决: 通过bit来存储一天,具体的组织形式是这样的 struct daybits { Year[] before_years; Year[] after_years; } struct Year { Quarter q1; Quarter q2; Quarter q3; Quarter q4; } struct Quarter {

利用JAVA的BitSet实现数组排序

各种经典排序算法网上还是比较多的,但是此处实现一个时间复杂度为O(n)(不完全准确,有一定条件)的排序算法.借助JAVA的BitSet来实现,仅提供一个思路. 废话不多说,直接上代码: public static void sort(){  int[] arr = new int[]{32,21,7,29,18,50};  int max = max(arr);  System.out.println(max);  BitSet bitSet = new BitSet(max);  //初始化b

Java中BitSet使用(转)

java.util.BitSet,采用位运算: 官方API:http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html 摘要: BitSet的使用场景及简单示例,可用于在JAVA程序中实现unqiue功能. BitSet简介 类实现了一个按需增长的位向量.位 set 的每个组件都有一个boolean值.用非负的整数将BitSet的位编入索引.可以对每个编入索引的位进行测试.设置或者清除.通过逻辑与.逻辑或和逻辑异或操作,可以使用一

java.util.BitSet 详细分析 学习笔记

1,BitSet类    大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的整数将 BitSet 的位编入索引.可以对每个编入索引的位进行测试.设置或者清除.通过逻辑与.逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容. 默认情况下,set 中所有位的初始值都是 false. 每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的

java中的BitSet

(1)BitSet类     大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的整数将 BitSet 的位编入索引.可以对每个编入索引的位进行测试.设置或者清除.通过逻辑与.逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容. 默认情况下,set 中所有位的初始值都是 false. 每个位 set 都有一个当前大小,也就是该位 set 当前所用空

hdu 2051 Bitset (java)

问题: 之前做过类似题,但这次仍然不能解决相关问题. 字符串倒过来输:StringBuffer str=new StringBuffer(s); s=str.reverse().toString() Bitset Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15548    Accepted Submission(s): 11804