JAVA的BIT数组

写个小东西,要去重复数字,用到BIT数组,虽然JAVA已经提供了一个BitSet,不过自己手痒,又写了一个简单的

原理就不写了,网上一大堆

 1 import java.util.Iterator;
 2 import java.util.function.BiConsumer;
 3
 4 public class BitArray implements Iterable<Boolean>{
 5     //表示1<<n的值,提高效率,不用每次计算
 6     private final byte[] MASK = new byte[]{1,2,4,8,16,32,64,(byte)128};
 7     byte[] bits;
 8     int max = 0;
 9
10     /**
11      * 构造一个Bit数组
12      * @param max 最大位数
13      */
14     public BitArray(int max){
15         this.max = max;
16         int len = max / 8 + 1;
17
18         bits = new byte[len];
19     }
20
21     /**
22      * 设置第N位的值
23      * @param index Bit索引
24      * @param value 值
25      */
26     public void set(int index,boolean value){
27         int i = index / 8;
28         int move = index % 8;
29
30         bits[i] = (byte)(bits[i] | MASK[move]);
31     }
32
33     /**
34      * 取得第N位的值
35      * @param index Bit索引
36      * @return
37      */
38     public boolean get(int index){
39         int i = index / 8;
40         int move = index % 8;
41
42         return (bits[i] & MASK[move]) == MASK[move];
43     }
44
45     /**
46      * 显示所有位
47      */
48     public void show(){
49         for(int i=0; i<bits.length; i++){
50             byte b = bits[i];
51             for(int bitIndex=0; bitIndex<8;bitIndex++){
52                 System.out.print( ((b>>bitIndex) & 1) + " ");
53             }
54             System.out.println();
55         }
56     }
57
58     /**
59      * 提供遍历接口
60      */
61     public Iterator<Boolean> iterator() {
62         return new Iterator<Boolean>(){
63             private int i = 0;
64
65             public boolean hasNext() {
66                 return i <= max;
67             }
68
69             public Boolean next() {
70                 return get(i++);
71             }
72
73         };
74     }
75
76     /**
77      * 遍历,偷懒用了JAVA8的新接口
78      * @param fun
79      */
80     public void forEach(BiConsumer<Integer,Boolean> fun){
81         int total = 0;
82         for(int i=0; i<bits.length; i++){
83             byte b = bits[i];
84             for(int bitIndex=0; bitIndex<8 && total<=max;bitIndex++,total++){
85                 fun.accept(total, ((b>>bitIndex) & 1) == 1);
86             }
87         }
88     }
89 }

使用方式:

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
*/
时间: 2024-10-17 10:25:11

JAVA的BIT数组的相关文章

Java基础学习——数组初识(1)

Java基础学习--数组初识(1) 1什么是数组 Java中常见的一种数据结构就是数组,数组可以分为一维数组.二维数组和多维数组. 数组是由一组相同的变量组成的数据类型,数组中每个元素具有相同的数据类型,数组中的每个元素都可以用一个统一的数组名和下标来确定. 2 数组的使用 数组的一般使用步骤: 声明数组 分配内存给该数组 下面是一维数组为例: 数据类型  数组名 []: 数组名 = new 数据类型 [数据个数]: 2.1一维数组的声明与赋值 1.数组的声明 int  num [];    

java随机数与数组的使用。

java随机数与数组的使用.    一:题目 二 代码:  public class Students {    int number;  // 学号    int State ;   // 年级    int Score ;    // 成绩         public Students(int number, int state, int score) {        super();        this.number = number;        State = state; 

透过字节码分析java基本类型数组的内存分配方式。

我们知道java中new方式创建的对象都是在堆中创建的,而局部变量对应的值存放在栈上.那么java中的int [] arr={1,2,3}是存放在什么地方的呢,int []arr = new int[3]又是存放在什么地方的呢, 下面我们通过编写两个小例子,通过查看生成的字节码文件,来了解jvm会如何来处理这两种情况的. 1.int[] arr = new int[3]示例 public class ArrayTest { public static void main(String[] arg

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

来源:http://www.imooc.com/code/1525 Java 中操作数组只需要四个步骤: 1. 声明数组 语法:  或者  其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简单地说,就是指定数组中最多可存储多少个元素 语法:  其中,数组长度就是数组中能存放元素的个数,如: 话说,我们也可以将上面的两个步骤合并,在声明数组的同时为它分配空间,如: 3. 赋值 分配空间后就可以向数组中放数据了,数组中元素都是通过下标来访问的,例如向 scores 数组中存放学生成绩 4.

在Java中判断数组中包含某个元素的几种方式的比较

闲来无事,将java中判断数组中包含某个元素的几种方式的速度进行对比,直接上代码 talk is cheap, show you the code package test.contain.lishaojie; import java.util.Arrays;import java.util.HashSet;import java.util.Set; public class TestContain { /** * @param args */ public static void main(S

Java基础:数组

转载请注明出处:jiq?钦's technical Blog 一.数组初始化 无论如何,当你要实例化一个数组对象的时候,必须要指定其大小. 不能在提供了initializer的情况下再去指定数组的维度!!! 正确的初始化方式有: 方式1:Int[][] array =new int[][]{{1,2},{3,4},{5},{2,4,2,1}}; 方式2:Int[][] array ={{1,2},{3,4},{5},{2,4,2,1}}; 方式3: Int[][] array =new int[

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

原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型.下面有两种方式. 第一种方法: public static byte[] int2byte(int

java学习之数组(二)

学编程吧java数组学习(二)发布了,欢迎大家通过xuebiancheng8.com来访问. 下面接着来分析数组,前面分析了什么是数组,为什么要用数组,下面来分析下如何使用数组 数组和其他数据类型一样,使用前要先定义.如下 int a[];这样就声明了一个数组 a = new int[10];然后为这个数组申请10个大小的空间 a[0] = 1; a[1] = 2; ....等等来为数组 赋值,为数组赋值完成后就可以通过下标来访问数组 当然数组在定义的时候也可以讲上面操作合并即 int a []

java学习之数组(一)

学编程吧java学习之数组发布了,欢迎大家通过xuebiancheng8.com来访问. 下面来分析下java中的数组. 什么是数组呢,为什么要用数组呢,加入现在需要统计一个班的考试成绩,这个班有30个学生,怎么办呢,如果不用数组,那么就得定义30个变量来保存30名同学的成绩,这样很明显对程序员来说是非常痛苦呢,光30个变量就得定义半天,而且又都不好记,容易记混了,那怎么办呢,这个时候就可以用数组,数组故名思议就是一组数的几个就叫数组,这这一组数使用同一个变量,只要一个变量就可以保存这30个同学

在java中删除数组元素的练习

有一个有序整数数组,要求输入一个数字,在数组中查找是否有这个数,如果有,将该数作为最后一个元素(其他元素仍然有序):如果没有,则显示“数组中没有这个数!” public static void main(String[] args) { int[] m={1,2,3,4,5,6,7,8,9,10}; System.out.println("请输入一个整数:"); Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int ind