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