java位图_位图Bitmap及其Java实现
举个例子,如下图,如果我们想要存放 0,2,4,5,10,11,12,14,15这几个数字,如果采用普通存储方式,若4位表示一个数字,这9个数字需要4*9=36位,至少36位才能存储这些数据。
如果采用位图的方式,只需要上图的16位就能存储这9个数字。
查找的时候,只需要查找这个位的数是1还是0即可,就可以确定该数存在不存在。
当数量足够大时候,不光大大压缩了存储空间,查找速率也极快,可以说是O(1)。
接下来我们看一下思路:
位图的实现,主要在于实现两个功能,一个是获取该位置的值,一个是设置该位置的值。
获取:
我们使用byte类型的数组来实现位图,byte类型在Java占1个字节也就是8位,可以存放8个数据。
先求是第几个字节:number/8;
再求该字节的第几个(0-7):i=number%8;
将这个字节数右移(7-i)位(也就是把要查找的位移动到最右侧),然后与 0000 0001相与,得到结果是0或1就可以确定。
public boolean get(int number){
//获取位置int site=number>>>3;//等价于 site=number/8//获取该字节byte temp=bitmap[site];
//获取该字节的第几个int i=number&7;//等价于 i=number%8
//将这个字节数右移(7-i)位(也就是把要查找的位移动到最右侧),然后与 0000 0001相与if(((temp>>>(7-i))&1)==0){
return false;
}
return true;
}
设置该位置的值:
也要先求是第几个字节:number/8;
再求该字节的第几个(0-7):i=number%8;
如果要设置为1:
将0000 0001 左移(7-i),此时’1’对应的位置就是该数对应位置,然后和该字节取“或”。
如果要设置为0:
将0000 0001 左移(7-i),此时’0’对应的位置就是该数对应位置,取反,然后和该字节相与。
private void set(int number, boolean bool){
//获取位置int site=number>>>3;//等价于 site=number/8//获取该字节byte temp=bitmap[site];
//获取该字节的第几个int i=number&7;//等价于 i=number%8//将0000 0001 左移(7-i)byte comp= (byte) (1<
if(bool){//设置为1bitmap[site]= (byte) (comp|temp);//取或(0.. 1 0..)}else {//设置为0comp= (byte) ~comp;//取反bitmap[site]= (byte) (comp&temp);//相与(1.. 0 1..)}
}
当存储相对范围比较小,数量特别大的情况下,使用位图的存储空间比直接存储要少得多,查找效率远比直接存储快得多。
所以特定条件下,使用位图能够大大提高存储效率和查找效率。
以下为全部代码:
/*** @Author: GoodbyeLullaby* @Date: 2019/12/2*/
public class Bitmap {
private byte bitmap[];
private int length;
public boolean get(int number){
//获取位置int site=number>>>3;//等价于 site=number/8//获取该字节byte temp=bitmap[site];
//获取该字节的第几个int i=number&7;//等价于 i=number%8byte comp=1;
//将这个字节数右移(7-i)位(也就是把要查找的位移动到最右侧),然后与 0000 0001相与if(((temp>>>(7-i))&1)==0){
return false;
}
return true;
}
private void set(int number, boolean bool){
//获取位置int site=number>>>3;//等价于 site=number/8//获取该字节byte temp=bitmap[site];
//获取该字节的第几个int i=number&7;//等价于 i=number%8//将0000 0001 左移(7-i)byte comp= (byte) (1<
if(bool){//设置为1bitmap[site]= (byte) (comp|temp);//取或(0.. 1 0..)}else {//设置为0comp= (byte) ~comp;//取反bitmap[site]= (byte) (comp&temp);//相与(1.. 0 1..)}
}
public void add(int index){
set(index,true);
}
public void delete(int index){
set(index,false);
}
public Bitmap (int length){
this.length=length;
bitmap=new byte[length>>>3];
}
public int getLength() {
return length;
}
public static void main(String[] args){
Bitmap bitmap=new Bitmap(100000);
bitmap.add(100);
System.out.println(bitmap.get(100));
bitmap.delete(100);
System.out.println(bitmap.get(100));
}
}
java位图_位图Bitmap及其Java实现相关推荐
- java风控_【A0538】[java视频教程]金融信贷风控的机器学习实战视频教程 it教程
Java视频教程名称:金融信贷风控的机器学习实战视频教程 java自学 风控视频教程 it教程 7 E" b1 z7 `/ _& G百度网盘下载链接:8 }, g4 o5 ...
- 我的世界java路径_我的世界java路径在哪 路径有误怎么设置
我的世界的各个版本中java都是十分重要的东西,许多玩家都会遇到Java路径有误的问题,并且不知道该如何解决,其实Java的路径这个东西在每个人的电脑中都是不太一样的,一般以你安装时的位置为准,在这里 ...
- 如何创建第一个java程序_创建第一个java程序
开发环境:ubuntu 10.04 + eclipse 方法一:打开eclipse编译器,选择 File->New->Java project,输入工程名称,点击finish,在工程目录中 ...
- 常用的java虚拟机_带你了解 JAVA虚拟机 面试必备
Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有 些区域则是依赖 ...
- vs java调试_基于VSCode的Java编程语言的构建调试环境搭建指南(作业三)
1.Java编译环境的搭建(CodeRunner) CodeRunner的强大之处在于它支持许多语言,只要选好语言,就直接可以写代码,即开即用的模式.时至今日,Code Runner已经有了超过400 ...
- java 精通_你真的精通Java吗?
简历和自我介绍上经常能够读到"精通Java"这样的话,有人和我说,精通Java的人太多了,精通Java已经不能算亮点.不能给自己加分了.可是事实真是这样吗? 对于语言的学习,我有一 ...
- java相册_精致小巧的java相册制作方法
本文实例为大家分享了java相册制作方法,供大家参考,具体内容如下 注: 1)html上的图片是静态指定的.当更新了新的图片时必须手工更新.所以使用Servlet读取本地images中的所有图片,动态 ...
- java内核_测量时间:从Java到内核再到
java内核 问题陈述 当您深入研究时,即使是最基本的问题也会变得很有趣. 今天,我想深入研究一下Java时间. 我们将从Java API的最基础知识开始,然后逐步降低堆栈:通过OpenJDK源代码g ...
- java基准测试_星期五基准功能Java
java基准测试 让我们的产品所有者有一天变得疯狂,并要求您执行以下操作: From a set of Strings as follows : " marco_8"," ...
最新文章
- underscore
- php排字符串的高低位怎么区分,PHP-根据字符串和所用字体计算字符串所占宽高...
- 安卓进阶系列-02搜索框(PersistentSearch)的使用
- 短信宝 php使用,[php] 使用 短信宝 发送短信(thinkphp)
- LDAP命令介绍---dstune
- GitHub开源项目 - Jeecg-Boot开始开发平台介绍
- 初学java之Map接口
- Windows下调试hadoop
- 解决gitlab内存占用过多的问题
- [资源数据]民族代码
- 大一新生计算机掌握情况word,2021年大一计算机学习心得word版
- (附源码)springboot猪场管理系统 毕业设计 160901
- P4167 [Violet]樱花
- Protoss and Zerg(快速幂)
- iOS 手势的用法
- 阿里,淘宝,天猫,京东2012年的大概销售额
- html 5 时代来了 视频播放还用falsh 还要找播放器 你out 了
- spring中 shiro logout 配置方式
- 同步发电机转子的转动惯量与运动方程(二) 同步发电机的转子运动方程
- 征服上司站稳脚13招
热门文章
- php定时执行任务,PHP定时执行任务的3种方法详解
- UG NX二次开发(C#)-最小包容体(块)
- 【poi第五节】poi设置Excel单元格边框 和 背景色,java设置Excel 单元格边框 和 背景色
- 尚观学习-ule-权限
- apt-get 更换源
- 前端vue项目-关于下载文件pdf/excel
- Pytorch的冻结以及解冻
- 程序员的幸福生活——有你的日子,每天都是情人节
- mysql错误1053 服务没有及时响应启动或控制请求_windows服务安装启动报错误1053:服务没有及时响应启动或控制请求...
- @Bean的方法中如何注入同一个@Configuration注解的类里的其他@Bean注解的bean