JAVA Bitset应用总结

bitset的用法 阅读详情

/** * 演示java.util.BitSet类的使用 * BitSet类表示自动增长位集合 * @author Sking */ package bitset; import java.util.BitSet; public class BitSetAPITest { public static void main(String[] args){ //BitSet的构造函数 BitSet b1=new BitSet(); BitSet b2=new BitSet(20); //set方法演示 for(int i=3;i<20;i+=3) b1.set(i); System.out.println(b1.toString());//{3, 6, 9, 12, 15, 18} for(int i=2;i<15;i+=2) b1.set(i, false); System.out.println(b1.toString());//{3, 9, 15, 18} b2.set(5, 10); System.out.println(b2.toString());//{5, 6, 7, 8, 9} b2.set(8,14,false); System.out.println(b2.toString());//{5, 6, 7} //flip方法演示 b2.flip(10,15); System.out.println(b2.toString());//{5, 6, 7, 10, 11, 12, 13, 14} b1.flip(15); System.out.println(b1.toString());//{3, 9, 18} //clear方法演示 b2.clear(10); System.out.println(b2.toString());//{5, 6, 7, 11, 12, 13, 14} b2.clear(6, 9); System.out.println(b2.toString());//{5, 11, 12, 13, 14} b2.clear(); System.out.println(b2.toString());//{} //get方法演示 boolean get9=b1.get(9); System.out.println(get9);//true BitSet b3=b1.get(3,10); System.out.println(b3.toString());//{0, 6} b1.set(7,13); b2.set(9,16); System.out.println(b1.toString());//{3, 7, 8, 9, 10, 11, 12, 18} System.out.println(b2.toString());//{9, 10, 11, 12, 13, 14, 15} //位集操作 b1.and(b2); System.out.println(b1.toString());//{9, 10, 11, 12} b2.xor(b1); System.out.println(b2.toString());//{13, 14, 15} b1.or(b2); System.out.println(b1.toString());//{9, 10, 11, 12, 13, 14, 15} b3.set(13,15); b2.andNot(b3); System.out.println(b2.toString());//{15} //设置位操作 System.out.println(b1.cardinality());//7 System.out.println(b2.isEmpty());//false b2.clear(); System.out.println(b2.isEmpty());//true System.out.println(b1.intersects(b3));//true //大小操作 System.out.println(b1.size());//64 System.out.println(b1.length());//16=15+1 //查找 System.out.println(b1.nextSetBit(9));//9 System.out.println(b1.nextClearBit(9));//16 System.out.println(b1.previousSetBit(20));//15 System.out.println(b1.previousClearBit(15));//8 //类型转化操作 //byte[] b=b1.toByteArray(); //long[] l=b1.toLongArray(); } }

 
	/**
	 * 借助BitSet使用筛选法查找指定范围内的素数
	 * @param limit 最大正数
	 */
	public static void searchPrime(int limit){
		BitSet bs=new BitSet(limit+1);
		//约定:不是素数的在BitSet中将相应的位设置为true
		int size=bs.size();
		bs.set(1);
		for(int i=4;i<size;i+=2)
			bs.set(i);//偶数均不是素数
		int finalBit=(int)Math.sqrt(size);
		for(int i=2;i<finalBit;i++)
				for(int j=2*i;j<size;j+=i)
					bs.set(j);
		int cout=0;
		for(int i=1;i<size;i++){
			if(!bs.get(i)){
				System.out.printf("%5d",i);
				if(++cout==0)
					System.out.println();
			}
		}
		System.out.println();
	}
	
	/**
	 * 判断一个字符串使用了哪些字符,输出格式为[字符序列]
	 * @param s 指定的字符串
	 * @return 字符串使用的字符序列
	 */
	public static String whichChars(String s){
		BitSet bs=new BitSet();
		//字符被使用,则将索引等于字符ASCII值的位置设置为true
		for(int i=0;i<s.length();i++)
			bs.set(s.charAt(i));
		StringBuffer sb=new StringBuffer();
		//输出格式化
		sb.append('[');
		int len=bs.length();
		for(int i=0;i<len;i++)
			if(bs.get(i))
				sb.append((char)i);
		sb.append(']');
		return sb.toString();	
	}


 

/**
 * 多哈希函数映射的快速查找算法,使用BitSet实现
 * 应用在一些需要快速判断某个元素是否属于集合,
 * 但是并不严格要求100%正确的场合,实现大数据处理。
 * 应用场景包括:爬虫中url的存储。
 * 
Bloom Filter实现原理:
1.创建BitSet,所有位初始为false,选择k个哈希函数
2.将插入值运用k个哈希函数映射到k个二进制位,将其设为true
3.如果k个二进制为中有一个有false,则表示原纪录未被加入过;
    如果k个二进制位都有true,则”认为“原纪录已被纪录过,
    但是实际上不能100%确定(false positive)。
 * @author Sking
 */
package bitset;

import java.util.BitSet;

public class BloomFilter {
	/* BitSet初始分配2^24个bit */
	private static final int DEFAULT_SIZE = 1 << 25;
	/* 不同哈希函数的种子,一般应取质数 */
	private static final int[] seeds = new int[] { 5, 7, 11, 13, 31, 37, 61 };
	private BitSet bits = new BitSet(DEFAULT_SIZE);
	/* 哈希函数对象 */
	private SimpleHash[] func = new SimpleHash[seeds.length];

	public BloomFilter() {
		for (int i = 0; i < seeds.length; i++) {
			func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
		}
	}

	// 将字符串标记到bits中
	public void add(String value) {
		for (SimpleHash f : func) {
			bits.set(f.hash(value), true);
		}
	}

	// 判断字符串是否已经被bits标记
	public boolean contains(String value) {
		if (value == null) {
			return false;
		}
		boolean ret = true;
		for (SimpleHash f : func) {
	//如果出现一次的bits.get(f.hash(value))为false,则原纪录未被加入过
			ret = ret && bits.get(f.hash(value));
		}
		return ret;
	}

	/* 哈希函数类,可修改哈希函数,实现更好的优化 */
	public static class SimpleHash {
		private int cap;//容量
		private int seed;//种子

		public SimpleHash(int cap, int seed) {
			this.cap = cap;
			this.seed = seed;
		}
		// hash函数,采用简单的加权和hash
		public int hash(String value) {
			int result = 0;
			int len = value.length();
			for (int i = 0; i < len; i++) {
				result = seed * result + value.charAt(i);
			}
			return (cap - 1) & result;//截取加权的低log2(cap)位
		}
	}
}


java.lang.Object

  java.util.BitSet

public class BitSet extends Object implements Cloneable, Serializable

——按需增长的位向量。默认情况下,set 中所有位的初始值都是 false。每个

    bitset都包含若干设置位(值为true的位)。

 

   构造函数

BitSet()  

BitSet(int nbits)

普通方法

——1.清除位

void clear()

void clear(int bitIndex)

void clear(int fromIndex,int toIndex)
——分别将全部位| 指定区间内的位(不包括toIndex)| 指定位设置为false

——2.翻转位

void flip(int bitIndex)

void flip(int fromIndex,int toIndex)

——将指定位| 指定区间内的位翻转

——3.设置位

void set(int bitIndex)

void set(int bitIndex,boolean value)

void set(int fromIndex,int toIndex)

void set(int fromIndex,int toIndex,boolean value)

——将指定位| 指定区间内的位设置为指定boolean值,没有指定则为true

——4.获取位

boolean get(int bitIndex)

BitSet get(int fromIndex,int toIndex)

——获取指定位| 指定区间内的位集

int nextSetBit|previousSetBit(int fromIndex)

——从指定位开始查找下一个|前一个true的位索引,没有返回-1

int nextClearBit|previousClearBit(int fromIndex)

——从指定位开始查找下一个|前一个false的位索引,没有返回-1

——5.位集操作《改变的是当前BitSet,而不是参数BitSet》

void and(BitSet set) //与

void or(BitSet set)  //或

void xor(BitSet set) //异或

void andNot(BitSet set) //不是与非操作

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

——6.设置位操作

int cardinality()

——位集中设置位的个数

boolean isEmpty()

——如果位集中没有设置位,则返回true

boolean intersects(BitSet set)

——如果两个位集中存在同一个位置均为设置位则返回true

——7.大小操作

int size()    //实际分配空间

int length()  //逻辑大小,最高设置位的索引加1

——8.打印操作

String toString()

——格式:{设置为true的位索引列表,用,分隔}

【C++】STL详解(十三)—— bitset(位图)的介绍与使用 今天我们比较详细地学习了bitset(位图)的介绍与使用,了解了一些有关的底层原理。接下来,我们将进行bitset(位图)的模拟实现。希望我的文章和讲解能对大家的学习提供一些帮助。 阅读详情

相关推荐

【java基础】BitSet基本说明和使用

Java平台的BitSet类用于存储一个位序列(它不是数学上的集,如果称为位向量或位数组可能更为合适)。如果需要高效地存储位序列(例如,标志),就可以使用位集。由于位集将位包装在字节里,所以使用位集要比使用Boolean对象的ArrayList高效得多。说人话就是使用位来存储boolean信息,0表示假,1表示真。BitSet由于使用bit位来存储信息,所以占用空间会比boolean数组使用空间更小,并且带有去重功能。该数据结构的一个应用就是10亿个手机号码去重(面试造火箭)

秃头披风侠的博客 4646

bitset的基本用法

一、概念 bitset可以说是一个多位二进制数,每八位占用一个字节,因为支持基本的位运算,所以可用于状态压缩,n位bitset执行一次位运算的时间复杂度可视为n/32. 二、基本操作 1.定义: bitset< n > s; 表示一个n位的二进制数,<>中填写位数; 2.位运算操作符: ~s: 返回对s每一位取反后的结果; &,|,^:返回对两个位数相同的bitset执行按位与、或、异或运算的结果; <<, >>:返回把一个bitset左移,右移若干

qq_44872284的博客 4万+

BitSet的应用

1.BitSet介绍 BitSet是用于存储二进制位和对二进制进行操作的Java数据结构,BitSet从jdk1.0开始就有了。它存储的是二进制位在BitSet中状态,根据对这些状态的判断,可以有很多应用。以前对数据的操作都是先把数据都是存储在内存中间的,现在可以通过设置BitSet的相应位达到存储数据信息的目的,极大的节省了内存空间。 2.BitSet应用 BitSet可以做的事情主要分为...

forever-and-ever的博客 3783

bitset——定义及常用操作。

前言:今天碰见了这个操作,发现在状态压缩的时候特别好用,就整理一下吧。 bitset 就相当于一个 只能存储二进制,也就是 0 和 1 的 bool 数组 但是可以直接当作一个数进行左移右移,取或取反等二进制操作。 如果直接用 bool 数组存储二进制每一位的话,n 位存储复杂度为 O(n),但是用 bitset 的话复杂度会减少到 O(n/32)。 所以一般用二进制状态压缩时就会用 bitset。 一、定义: 对于 bitset 的定义有四种方式: 1、直接定义,每一位初始为0: bitset<

Mr_dimple的博客 1万+

点云工具CloudCompare下载、安装与汉化

打开软件后,是英文界面,找到菜单栏【Display】-【Language Translation】,选择简体中文。进入官网后,点击菜单栏【Download】提示需要重启软件才能生效,点OK即可。重启软件后,已经是中文了。选择合适系统进行下载。常规软件安装流程即可。

sagima_sdu的博客 1万+

ROS2实战:手把手教你用walking机器人仿真实现医院多楼层自动配送(含实时地图切换)

本文详细介绍了如何利用ROS2和walking机器人仿真平台实现医院多楼层自动配送系统,重点讲解了动态地图切换技术和多楼层导航的实现方法。通过实时加载地图和优化电梯过渡策略,解决了医院复杂环境下的自主配送难题,为医疗物流自动化提供了实用解决方案。

weixin_29090917的博客 364

java bitset用途_Java的BitSet原理及应用

Java的BitSet原理及应用原理众所周知,Java的BitSet使用一个Long(一共64位)的数组中的没一位(bit)是否为1来表示当前Index的数存在不。但是BitSet又是如何实现的呢?其实只需要理解其中的两个方法:setget就能够理解BitSet的实现原理是什么了。set先看源代码:public void set(int bitIndex) {if (bitIndex < 0...

weixin_36057373的博客 526

玩转Isaac Sim动态控制:从随机舞动到精准操控Franka的5种控制模式实测

本文深入实测了在NVIDIA Isaac Sim仿真平台中,利用Dynamic Control模块对Franka机械臂进行精准操控的五种核心模式:位置控制、单关节位置控制、速度控制、单关节速度控制和力矩控制。通过详细的代码示例和对比分析,阐述了每种模式的适用场景、参数调优技巧及从随机运动到闭环控制的实现路径,为机器人算法验证提供了实用指南。

night的博客 808

java bitset 应用_Java BitSet使用场景和示例

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

weixin_29359001的博客 199

Flink CDC 3.0 详解

Flink CDC 是基于数据库日志 CDC(Change Data Capture)技术的实时数据集成框架,支持全增量一体化、无锁读取、并行读取、表结构变更自动同步、分布式架构等高级特性。配合Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量数据的实时集成。Flink CDC 于2023年12月7日重磅推出其全新的 3.0 版本,3.0版本的发布对 Flink CDC 而言具有里程碑的意义,自此 Flink CDC 从捕获数据变更的Flink 数据源正式迈向为以 Flink

奔跑的蜗牛的博客 2639

ROS基础(一)——命令行代码(以小乌龟程序为例)

ROS学习(一)——命令行代码(以小乌龟程序为例)1 基础命令行语句1.1 roscore1.2 rqt_graph(显示系统计算图)1.3 rosnode(显示所有节点相关信息)1.4 rostopic(和话题相关)2 服务类型指令rosservice同时存在两只海龟3 指令记录 1 基础命令行语句 从大二四旋翼无人机编队后就没再接触过ROS了,最近由于科研任务需要重新捡起来,打算系统学一下!学习过程参考古月居老师的视频,有兴趣的同学可以去[BliBli]学习。 学习平台:Ubuntu 18.04 硬件

北理自动化小白 6267

深入解读 Java BitSet:高效位操作与应用场景全面剖析

在Java中,BitSet是一个强大且高效的位操作工具类,适用于需要处理大量布尔值的场景。本文将深入解析BitSet的基础用法、遍历方法、位逻辑运算以及高级操作,帮助开发者全面掌握这一工具类。我们还将探讨BitSet在实际应用中的典型场景,包括布隆过滤器、去重和位图索引,展示其在大数据处理和高性能计算中的优势。通过详尽的代码示例和性能分析,本文旨在帮助读者充分理解并灵活运用BitSet,提升程序的性能和效率。

Java领域优秀创作者 2921

【YOLOv7-环境搭建】PyTorch安装后输出版本显示No module named ‘Torch’的解决方法

【YOLOv7-环境搭建】PyTorch安装后输出版本显示No module named ‘Torch’的解决方法:①检查PyCharm导入的环境是否错误②添加Torch包

qq_59942266的博客 4970

java bitset 应用_对java的BitSet的多线程并发的探索

java的BitSet不是线程安全的,所以多线程的时候h要加锁。1 直接加锁整个BitSet 用时:3.4秒2 BitSet拆成更小的粒度 用时:3.6秒3 使用并发的BitSet,自己写了个AtomicBitSet 用时:3.3秒从测试结果来看 性能都差不多感觉有点疑惑,在我的想象中2还和3应该会比1好不少的啊下面3个测试分别对应3种方式附件是完整代码测试1packag...

weixin_35698659的博客 176

华为OD机试 - 服务中心选址(Python)

一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。先输入区域数组positions的长度n(1 ≤ n ≤ 10^5)接下来 n 行每行输入成对的left和right值,以空格隔开。输出为location。

m0_46181452的博客 282

Objective-C实现人工势场法(附完整源码)

Objective-C实现人工势场法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 426

java BitSet原理解析

       学习了Java BitSet之后,写下这篇博文记录一下BetSet的原理及使用场景。 一、BitSet原理        BitSet,通过这个名字字面意思(位集合),就可以知道,它的使用应该与位(Bit)有关。事实也确实如此,它(BitSet)用于标志一个“东西”是否存在于这个“东西”的一个集合里面。这句话很拗口,举实例来说明,比如:一个字符是否存在一个字符串中。一个数字是否存...

林序的博客 2117

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java bitset转string_Java中BitSet使用(转)

packageutil;importjava.util.Arrays;importjava.util.BitSet;public classBitSetDemo {/*** 求一个字符串包含的char**/public static voidcontainChars(String str) {BitSet used= newBitSet();for (int i = 0; i < str.l...

weixin_39756192的博客 501

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java基础:JAVA中BitSet使用详解

适用场景 整数,无重复 Bitset 基础 Bitset,也就是位图,由于可以用非常紧凑的格式来表示给定范围的连续数据而经常出现在各种算法设计中。上面的图来自c++库中bitset的一张图。 基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。使用用的时候既可根据某一个是否为0表示此数是否出现过。 一个1G的空间,有 8102410241024=8.5810^9bit,也就...

TuT 8361

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

科普文:Java基础之算法系列【JDK自带位图BitSet源码解读】

在Java中,BitSet在jdk1.0中就已经存在了。该类实现了一个根据需要增长的位向量。位组的每个组件都具有boolean值。BitSet的位由非负整数索引。可以检查,设置或清除各个索引位。一个BitSet可用于通过逻辑AND,逻辑包含OR和逻辑异或运算来修改另一个BitSet的内容。默认情况下,集合中的所有位最初都具有值false。每个位集都有一个当前大小,即当前位集使用的空间位数。请注意,大小与位集的实现有关,因此它可能随实现而改变。位集的长度与位集的逻辑长度有关,并且与实现无关的定义。‌。

为无为,事无事,味无味。 1360

Java BitSet使用场景和示例

阅读目录一、什么是BitSet?二、Java BitSet实现原理三、使用场景四、参考资料 回到顶部一、什么是BitSet?   注:以下内容来自JDK API:   BitSet类实现了一个按需增长的位向量。位Set的每一个组件都有一个boolean值。用非负的整数将BitSet的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet修改另一个 BitSet的内容。    默认情况下,set 中所有位的初始值都是false。

灼烧的疯狂 495

java中的BitSet

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

aod83029的博客 115

BitSet的用法

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

aqCat的博客 3899

BitSet的应用实践

1.BitSet介绍 BitSet是用于存储二进制位和对二进制进行操作的Java数据结构,BitSet从jdk1.0开始就有了。它存储的是二进制位在BitSet中状态,根据对这些状态的判断,可以有很多应用。以前对数据的操作都是先把数据都是存储在内存中间的,现在可以通过设置BitSet的相应位达到存储数据信息的目的,极大的节省了内存空间。 2.BitSet应用 BitSet可以做的事情主要分为...

qq_2300688967的博客 477

Java BitSet的理解与使用

https://blog.youkuaiyun.com/drdongshiye/article/details/90740695 一,概括 BitSet是位操作的对象,值只有0或1即false和true,内部维护了一个long数组,初始只有一个long,所以BitSet最小的size是64,当随着存储的元素越来越多,BitSet内部会动态扩充,一次扩充64位,最终内部是由N个long来存储。 默认情况下,BitSet的所有位都是false即0。 在没有外部同步的情况下,多个线程操作一个BitSet是不安全的。

yygr的博客 1472
下一篇: 排序算法终结总结<Java实现>
originalIntention
博客等级 码龄14年 12粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值