BitSet與Byte數組互轉

        BitSet是位操做的對象,值只有0或1即false和true,最經常使用的地方是用戶、系統開關,原理是內部維護了一個long數組,初始只有一個long,因此BitSet最小的size是64,當隨着開關愈來愈多,會動態擴充,最終內部是由N個long來存儲,這些對操做都是透明的。

        爲何要將BitSet和Byte數組進行互轉呢,場景,假設咱們爲每一個用戶對象設了一個開關字段對應的mysql表是blob類型,裏面存儲了用戶不少的開關,若是在64個開關之內徹底能夠用long來存儲,可是考慮到擴展性,本身來維護N個long仍是有難度的,因此利用BitSet對象來存儲。BitSet已經實現了java的Serializable接口,能夠直接序列化,可是考慮到跨語言,因此不能直接用java序列化,須要將BitSet轉成Byte數組,讀取時在將Byte數組轉爲BitSet對象。  java

import java.util.Arrays;
import java.util.BitSet;

public class BitSetConvert {
	public static byte[] bitSet2ByteArray(BitSet bitSet) {
		byte[] bytes = new byte[bitSet.size() / 8];
		for (int i = 0; i < bitSet.size(); i++) {
			int index = i / 8;
			int offset = 7 - i % 8;
			bytes[index] |= (bitSet.get(i) ? 1 : 0) << offset;
		}
		return bytes;
	}

	public static BitSet byteArray2BitSet(byte[] bytes) {
		BitSet bitSet = new BitSet(bytes.length * 8);
		int index = 0;
		for (int i = 0; i < bytes.length; i++) {
			for (int j = 7; j >= 0; j--) {
				bitSet.set(index++, (bytes[i] & (1 << j)) >> j == 1 ? true
						: false);
			}
		}
		return bitSet;
	}
	
	public static void main(String[] args) {
		BitSet bitSet = new BitSet();
		bitSet.set(0, true);
		bitSet.set(10, true);
		//將BitSet對象轉成byte數組
		byte[] bytes = bitSet2ByteArray(bitSet);
		System.out.println(Arrays.toString(bytes));
		
		//在將byte數組轉回來
		bitSet = byteArray2BitSet(bytes);
		System.out.println(bitSet.get(0));
		System.out.println(bitSet.get(10));
	}
}
相關文章
相關標籤/搜索