写个小东西,要去重复数字,用到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数组的更多相关文章

  1. Java反射遍历数组

    日志中有时候需要查看数组中的值,但是重载很多的打印函数,觉得很别扭.所以想通过反射,获取数组中的值,打印出来.Java提供了数组反射操作的类,之前没有关注过,提供的方法简单易用. public sta ...

  2. 慕课网-安卓工程师初养成-6-3 如何使用 Java 中的数组

    来源:http://www.imooc.com/code/1525 Java 中操作数组只需要四个步骤: 1. 声明数组 语法:  或者  其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简 ...

  3. Java中的数组操作进阶

    package com.mi.array; import java.util.Arrays; /** * System.arraycopy(i, 0, j, 0, i.length);这种复制会覆盖目 ...

  4. 如何使用 Java 中的数组

    Java 中操作数组只需要四个步骤: 1. 声明数组 语法:  数据类型[ ] 数组名: 或者   数据类型 数组名[ ]: 其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简单地说,就是指 ...

  5. Java之组合数组1

    我们先说"数组",数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素. 一.一维数组的定义 type arrayName[]; 其中类型(type ...

  6. Java比较器对数组,集合排序一

    数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...

  7. 【转】java中byte数组与int类型的转换(两种方式)----不错

    原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...

  8. java随机数与数组的使用。

    java随机数与数组的使用.    一:题目 二 代码:  public class Students {    int number;  // 学号    int State ;   // 年级   ...

  9. Java的byte数组

    今天我们讨论一下Java的byte数组.byte数组就是字节数组,每一位存一个字节.看下面程序,猜猜输出多少? package com.wjy.bytes; import java.io.File; ...

  10. Java 泛型 泛型数组

    Java 泛型 泛型数组 @author ixenos 先给结论 不能(直接)创建泛型数组 泛型数组实际的运行时对象数组只能是原始类型( T[]为Object[],Pair<T>[]为Pa ...

随机推荐

  1. 关于EJB 时间注解与oracle数据库时间格式

    EJB中Temporal是时间注解,其中TemporalType是时间注解的枚举类型其中包括 TemporalType类型,请看源码/*** Type used to indicate a speci ...

  2. EC读书笔记系列之9:条款16、17

    条款16 成对使用new和delete时要采取相同形式 记住: ★若你在new表达式中使用[ ],必须在相应的delete中也使用[ ],反之亦然 -------------------------- ...

  3. poj 3100

    题意:给你两个数B.N,求一个数的N次方最接近B. 先求出B的1/N次方:A,然后比较A和A+1的N次方那个更接近B #include<stdio.h> #include <math ...

  4. JVM学习之JVM1.6 GC详解

    转自:http://www.cnblogs.com/ggjucheng/p/3977384.html,多谢分享 前言  JVM GC是JVM的内存回收算法,调整JVM GC(Garbage Colle ...

  5. 图解MYSQL JOIN ON,SQL JOIN 详解,数据库sql join语句

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  6. <转>eclipse如何修改dynamic web module version .

         --------------------------------------------------------------------------------------------- 原 ...

  7. Android SQLiteDatabase使用总结

    SQLiteDatabase数据库操作 1.创建一个继承了类SQLiteOPenHelper类复写相应的方法,和构造函数 2.然后创建一个类,定义一个私有变量(上述类的实例化对象),在构造函数中进行初 ...

  8. Xampp Linux应用

    一.基本操作: 1.Xampp安装包下载:   https://www.apachefriends.org/index.html   2.安装与配置:   将xampp-linux-x64-5.6.3 ...

  9. ODI KM二次开发手册

    ODI KM二次开发手册   分类: ODI(16) 目录(?)[+] 1 引言 1.1 编写目的 本手册面向的读者对象为具备数据集成业务知识及对ODI操作了解的开发人员,作为其完成基于ODI基础上K ...

  10. MyEclipse配色字体等配置的解决方案

    Myeclipse黑色配色方案(精心修改版) http://download.csdn.net/detail/rehongchen/6579945 如何改变Myeclipse编辑区背景色 http:/ ...