Skip to content

BitMap #3

Open
Open

Description

@maskleo
public class BitMap {
    /**
     * bitmap(位图)的方式节约空间
     */
    private final int[] bitmap;
    private final int size;
    public BitMap(final int size) {
        this.size = size;
        int sLen = ((size%32) == 0) ? size/32 : size/32 + 1;
        this.bitmap = new int[sLen];
    }
     
    private static int _Index(final int number ){
        return number / 32;
    }
     
    private static int _Position(final int number){
        return number % 32;
    }
     
    private void adjustBitMap(final int index, final int position) {
        int bit = bitmap[index] | (1 << position);
        bitmap[index] = bit;
    }
     
    public void add(int[] numArr){
        for(int i=0; i<numArr.length; i++)
            add(numArr[i]);
    }
     
    public void add(int number) {
        adjustBitMap(_Index(number),_Position(number));
    }
     
    public boolean getIndex(final int index) {
        if(index > size) return false;
         
        int bit = (bitmap[_Index(index)] >> _Position(index)) & 0x0001;
        return (bit == 1);
    }
 
    @Override
    public String toString() {
        StringBuffer sbf = new StringBuffer(size);
        for(Integer i : bitmap) {
            StringBuffer tmp = new StringBuffer(32);
            String bits = Integer.toBinaryString(i);
            for(int b=0; b<32-bits.length(); b++)
                tmp.append(0);
            tmp.append(bits);
            sbf.append(tmp.reverse());
        }
        String s = sbf.substring(0, size).toString();
//      System.out.println("bitmap length: " + bitmap.length + " \r\nsize:" + size);
        return StringUtils.reverse(s);
    }
     
    public static void main(String[] args) {
        BitMap bm = new BitMap(Integer.MAX_VALUE);
//      int searchNum = 56;
        int searchNum = 99;
        int[] numArr = {19, 64, 45, 56, 0, 54, 28, 2, 23, 34, 40, 18, 54, 50, 49, 29, 20, 31, 47, 30, 24, 17, 50, 57, 33, 55, 21, 22, 27, 45, 3, 19, 17, 49, 24, 5, 15, 24, 27, 35, 6, 53, 9, 61, 4, 6, 12, 23, 52, 48, 39, 39, 21, 1, 11};
        bm.add(numArr);
        for(int i : numArr)
            System.out.println(bm.getIndex(i));
         
        System.out.println(bm.getIndex(searchNum));
    }
     
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions