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
*/

 

posted @ 2016-01-29 10:16  灰色逻辑  阅读(5900)  评论(0编辑  收藏  举报