一、结构思想

以 bit 作为存储单位进行布尔值存取的数据结构。
表现为:给定第i位,该bit为1则表示true,为0则表示false。

二、使用场景及优点

适用于对布尔或0、1值进行(大量)存取的场景。

如:记录一个用户365天的签到记录,签了为true,没签为false。若是以普通key/value数据结构,每个用户都需要记录365条,当用户量很大时会造成巨大的空间开销。
因此运用位图的话,每天签到记录只占1个位(bit),一共就365位,则只需48个字节就能容纳。

优点
低空间开销且高效的布尔值存取

三、具体实现

实现源码:https://github.com/SimpleIto/data_structure/blob/master/src/bitmap/Bitmap.java

主要考虑以下问题:

  1. 用什么物理结构存储一系列bit?
  2. 如何通过位操作高效的实现对指定bit的获取、修改操作?(而不是通过字符串转去转来臃肿的实现)

解决思路:

  1. Java中,使用 byte[] 字节数组来存储bit。 1 byte = 8 bit
  2. 对于获取操作
    思路:拿到目标bit所在的byte后,将其向右位移(并将高位置0),使目标bit在第一位,这样结果值就是目标bit值。
    1) 通过 byte[index >> 3] (等价于byte[index/8])取到目标bit所在的byte。
    2) 令 i = index&7(等价于index%8)得到目标bit在该byte中所在的位置。
    3) 为了将目标bit前面的高位置0(这样位移后的值才等于目标bit本身):需要构建到目标bit为止的低位掩码,即 0b11111111 >>>(7 - i),再与原byte做&运算。
    4) 最后将结果向右位移 i 位,使目标bit处在第一位,结果值即为所求。
  3. 对于修改操作
    思路:根据设定值true或false的不同,分为两种操作逻辑
    1) 如果value为true,则目标位应与1做“或”运算。需构建“目标位为1,其他为0”的操作数(因为实际操作的是byte,为了只修改目标bit,而不影响其他位)
    2) 如果value为false,则目标位应与0做“与”运算。则需构建“目标位为0,其他为1”的操作数。
    3) 构建目标位为1其他位为0的操作数:1 << (index & 7)

Bitmap 位图 Java实现的更多相关文章

  1. Android 学习笔记之Bitmap位图虽触摸点移动

    package xiaosi.bitmap; import android.app.Activity; import android.os.Bundle; public class mianActiv ...

  2. Android学习笔记之Bitmap位图虽触摸点移动

    package xiaosi.bitmap; import android.app.Activity; import android.os.Bundle; public class mianActiv ...

  3. 重温delphi之:如何将Bitmap位图与base64字符串相互转换

    先引用delphi自带的单元 uses EncdDecd; 然后就可以使用下面二个函数了: by 菩提树下的杨过 http://yjmyzz.cnblogs.com/ ///将Bitmap位图转化为b ...

  4. delphi中Bitmap位图与base64字符串相互转换

    uses EncdDecd; ///将Bitmap位图转化为base64字符串 function BitmapToString(img:TBitmap):string ; var ms:TMemory ...

  5. bittorrent 学习(一) 种子文件分析与bitmap位图

    终于抽出时间来进行 BITTORRENT的学习了 BT想必大家都很熟悉了,是一种文件分发协议.每个下载者在下载的同时也在向其他下载者分享文件. 相对于FTP HTTP协议,BT并不是从某一个或者几个指 ...

  6. 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究

    通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”.位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况. 1.为比较区别,创建两种索引类型 ...

  7. Bitmap 位图

    转自: http://dongxicheng.org/structure/bitmap/ 1.  概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用.本文介绍了位图的实现 ...

  8. 使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用

    在 WPF 中将一个现成的 Bitmap 位图转换成 ImageSource 用于显示一个麻烦的事儿,因为 WPF 并没有提供多少可以转过来的方法.不过产生 Bitmap 来源却非常多,比如屏幕截图. ...

  9. ( 转 ) 数据库BTree索引、Hash索引、Bitmap位图索引的优缺点

    测试于:MySQL 5.5.25 当前测试的版本是Mysql 5.5.25只有BTree和Hash两种索引类型,默认为BTree.Oracle或其他类型数据库中会有Bitmap索引(位图索引),这里作 ...

随机推荐

  1. Q矩阵输出

    程序启动时: 1.Q矩阵在InitQX中对角阵赋初值为0.25,GPS卫星数6 2.Q矩阵初值在初始化时由GetBL获得,改变Q对角阵 Q初值第0个卫星 10000000000.000 X初值第0个卫 ...

  2. UI中新增一个右击按钮的过程

    1.首先给出增加之后的成品 点击后的界面 3.需要增加的部分 新增一个类:DiglogAddUser  用于操作用户填写的数据,写入数据库等操作 3.1首先在资源文件中定义窗口代号 3.2 枚举出该代 ...

  3. Redis系列九:redis集群高可用

    Redis集群的概念: RedisCluster是redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的需求,当一个服务挂了可以快速的切换到另外一个服务,当遇到单机内存. ...

  4. ES6标准简介之Babel转码器解说

    ES6是ECMAScript 6的简称,是JavaScript语言的下一代标准,现在基于jquery库的前端开发js所使用的标准是ES5(ECMAScript 5).ES6已于2015年6月正式发布. ...

  5. luogu P1891 疯狂LCM

    嘟嘟嘟 这题跟上一道题有点像,但是我还是没推出来--菜啊 \[\begin{align*} ans &= \sum_{i = 1} ^ {n} \frac{i * n}{gcd(i, n)} ...

  6. php请求API接口方法

    thinkphp下直接放入公共函数即可. /** * 通过URL获取页面信息 * @param string $url 地址 * @return string 返回页面信息 */ function g ...

  7. 开源http协议库curl和wget的区别和使用

    curl和wget基础功能有诸多重叠,如下载等. 在高级用途上的curl由于可自定义各种请求参数所以长于模拟web请求,用于测试网页交互(浏览器):wget由于支持ftp和Recursive所以长于下 ...

  8. mysql做了主从,删除binlog日志

    在主服务器操作: 1.查看当前主从库是用哪个binlog日志在做组从 show master status show  slave status 2.查看主库的binlog日志 show master ...

  9. 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明

    程序发布后出现问题: 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明 解决办法: 1.安装了odac12.  ODTwithODAC121010.z ...

  10. 【css】gradient匹配ps渐变叠加效果

    CSS3 Gradient分为linear-gradient(线性渐变)和radial-gradient(径向渐变). 一.linear-gradient(线性渐变) eg:background: l ...