JAVAのBIT配列

7868 ワード

小さいものを書いて、数字を繰り返して、BIT配列を使って、JAVAはすでに1つのBitSetを提供しましたが、しかし自分でかゆくて、また1つの簡単なことを書きました
原理は書かないで、ネット上はたくさんあります
 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
*/