JAVA的BIT数组
写个小东西,要去重复数字,用到BIT数组,虽然JAVA已经提供了一个BitSet,不过自己手痒,又写了一个简单的
原理就不写了,网上一大堆
- import java.util.Iterator;
- import java.util.function.BiConsumer;
- public class BitArray implements Iterable<Boolean>{
- //表示1<<n的值,提高效率,不用每次计算
- private final byte[] MASK = new byte[]{1,2,4,8,16,32,64,(byte)128};
- byte[] bits;
- int max = 0;
- /**
- * 构造一个Bit数组
- * @param max 最大位数
- */
- public BitArray(int max){
- this.max = max;
- int len = max / 8 + 1;
- bits = new byte[len];
- }
- /**
- * 设置第N位的值
- * @param index Bit索引
- * @param value 值
- */
- public void set(int index,boolean value){
- int i = index / 8;
- int move = index % 8;
- bits[i] = (byte)(bits[i] | MASK[move]);
- }
- /**
- * 取得第N位的值
- * @param index Bit索引
- * @return
- */
- public boolean get(int index){
- int i = index / 8;
- int move = index % 8;
- return (bits[i] & MASK[move]) == MASK[move];
- }
- /**
- * 显示所有位
- */
- public void show(){
- for(int i=0; i<bits.length; i++){
- byte b = bits[i];
- for(int bitIndex=0; bitIndex<8;bitIndex++){
- System.out.print( ((b>>bitIndex) & 1) + " ");
- }
- System.out.println();
- }
- }
- /**
- * 提供遍历接口
- */
- public Iterator<Boolean> iterator() {
- return new Iterator<Boolean>(){
- private int i = 0;
- public boolean hasNext() {
- return i <= max;
- }
- public Boolean next() {
- return get(i++);
- }
- };
- }
- /**
- * 遍历,偷懒用了JAVA8的新接口
- * @param fun
- */
- public void forEach(BiConsumer<Integer,Boolean> fun){
- int total = 0;
- for(int i=0; i<bits.length; i++){
- byte b = bits[i];
- for(int bitIndex=0; bitIndex<8 && total<=max;bitIndex++,total++){
- fun.accept(total, ((b>>bitIndex) & 1) == 1);
- }
- }
- }
- }
使用方式:
- public static void main( String[] args ) throws Exception
- {
- BitArray bits = new BitArray(18);
- bits.set(18,true);
- System.out.println("position 3 : " + bits.get(3));
- System.out.println("position 18 : " + bits.get(18));
- System.out.println("--------------------------");
- //遍历方式 一
- int i = 0;
- for(Boolean result : bits)
- System.out.println(i++ + " : " + result);
- System.out.println("--------------------------");
- //遍历方式二
- BiConsumer<Integer,Boolean> fun = (index, value)->{
- System.out.println(index + " : " + value);
- };
- bits.forEach(fun);
- }
输出结果:
- /*
- position 3 : false
- position 18 : true
- --------------------------
- 0 : false
- 1 : false
- 2 : false
- 3 : false
- 4 : false
- 5 : false
- 6 : false
- 7 : false
- 8 : false
- 9 : false
- 10 : false
- 11 : false
- 12 : false
- 13 : false
- 14 : false
- 15 : false
- 16 : false
- 17 : false
- 18 : true
- --------------------------
- 0 : false
- 1 : false
- 2 : false
- 3 : false
- 4 : false
- 5 : false
- 6 : false
- 7 : false
- 8 : false
- 9 : false
- 10 : false
- 11 : false
- 12 : false
- 13 : false
- 14 : false
- 15 : false
- 16 : false
- 17 : false
- 18 : true
- */
JAVA的BIT数组的更多相关文章
- Java反射遍历数组
日志中有时候需要查看数组中的值,但是重载很多的打印函数,觉得很别扭.所以想通过反射,获取数组中的值,打印出来.Java提供了数组反射操作的类,之前没有关注过,提供的方法简单易用. public sta ...
- 慕课网-安卓工程师初养成-6-3 如何使用 Java 中的数组
来源:http://www.imooc.com/code/1525 Java 中操作数组只需要四个步骤: 1. 声明数组 语法: 或者 其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简 ...
- Java中的数组操作进阶
package com.mi.array; import java.util.Arrays; /** * System.arraycopy(i, 0, j, 0, i.length);这种复制会覆盖目 ...
- 如何使用 Java 中的数组
Java 中操作数组只需要四个步骤: 1. 声明数组 语法: 数据类型[ ] 数组名: 或者 数据类型 数组名[ ]: 其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简单地说,就是指 ...
- Java之组合数组1
我们先说"数组",数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素. 一.一维数组的定义 type arrayName[]; 其中类型(type ...
- Java比较器对数组,集合排序一
数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...
- 【转】java中byte数组与int类型的转换(两种方式)----不错
原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...
- java随机数与数组的使用。
java随机数与数组的使用. 一:题目 二 代码: public class Students { int number; // 学号 int State ; // 年级 ...
- Java的byte数组
今天我们讨论一下Java的byte数组.byte数组就是字节数组,每一位存一个字节.看下面程序,猜猜输出多少? package com.wjy.bytes; import java.io.File; ...
- Java 泛型 泛型数组
Java 泛型 泛型数组 @author ixenos 先给结论 不能(直接)创建泛型数组 泛型数组实际的运行时对象数组只能是原始类型( T[]为Object[],Pair<T>[]为Pa ...
随机推荐
- npm 安装参数中的-save和 -save-dev
当你为你的模块安装一个依赖模块时,正常情况下你得先安装他们(在模块根目录下npm install module-name),然后连同版本号手动将他们添加到模块配置文件package.json中的依赖里 ...
- firefox 自写底层扩展,源码简介
还记得2010年的时候,那时候开始喜欢上了js,经常逛MDN 一开始写些简单的油猴脚本,慢慢的接触了扩展开发,发现用自己的js知识 加上firefox的插件API,可以完成好多功能. 看了很多插件的源 ...
- Python中文显示问题
默认pyhon使用ASCII码来解释程序的,默认不支持中文,需要在程序的第一行或者第二行声明编码. 官方解决方案:https://www.python.org/dev/peps/pep-0263/ T ...
- C语言复杂的函数指针声明
复习C语言ING,发现复杂的函数指针声明看不懂,百度半天终于略知一二. 讲的比较详细的一篇blog: http://blog.csdn.net/megaboy/article/details/4827 ...
- android 添加左右滑屏手势
今天要在自己的项目中添加左右滑动,实现日期的加减(原来已经做了加减按键).滑动在一个中间的layout中进行 思路:添加左右划屏幕判断,得到判断后模拟加减按键按下. 模拟按键按下用 mbotton.p ...
- 組裝工廠設置IQC的目的
在電子組裝工廠的組織裡,一般都會有 IQC (Incoming Quality Control) 這個單位,台灣稱之為「入(進)料管控」,大陸稱之為「來料管控」,其最主要目的在攔檢所有買進材料是否符合 ...
- Unix/Linux环境C编程入门教程(6) 安装Fedora C/C++开发环境
安装Fedora C/C++开发环境 1 Fedora 是一个开放的.创新的.前瞻性的操作系统和平台,基于 Linux. 2.选择自定义配置 3.设置版本为10.0 4.选择稍后安装 5.选择64位 ...
- 使用border-image实现类似iOS7的1px底边
使用border-image实现类似iOS7的1px底边 iOS7已经发布有一段时间,扁平化设计风格有很多值得称赞的地方,其中有很多设计细节都是值得研究的. 首先,来看下面iOS设置的截图中的bord ...
- 20140613_JavaWeb学习之开发环境配置篇
本文所使用软件百度云盘网址:http://pan.baidu.com/s/1kTDRFwz 1安装JDK 操作系统:windows7-64bit 版本号:jdk-7u51-windows-x64 安装 ...
- SQL数据库插入文本信息
文本内容