首页 > java > 利用位图法操作海量数据

利用位图法操作海量数据

作者:bin

位图法的原理主要就是利用int类型数据,一个int类型数据是4个字节,一个字节8位,然后一个int数据利用自身字节位就可以表示0-31的数是否存在,bit位表示数值,位山0,1值表示这个数值是否存在。


代码实现

package com.thread;

import java.util.*;


public class Solution {

    public static void main(String[] args) {
        Solution s = new Solution();
        s.set(1000000, true);
        s.set(2, true);
        s.set(3, true);

        System.out.println(s.get(1000000));
        System.out.println(s.get(2));
        System.out.println(s.get(3));
        System.out.println(s.get(4));
        System.out.println(s.get(5));
    }

     private byte[] bitmap = new byte[781250];

    public boolean get(int number){
        //获取位置
        int site=number>>>3;//等价于 site=number/8
        //获取该字节
        byte temp = bitmap[site];

        //获取该字节的第几个
        int i=number&7;//等价于 i=number%8

        //将这个字节数右移(7-i)位(也就是把要查找的位移动到最右侧),然后与 0000 0001相与
        if(((temp>>>(7-i))&1)==0){
            return false;
        }
        return true;
    }

    private void set(int number, boolean bool){
        //获取位置
        int site=number>>>3;//等价于 site=number/8
        //获取该字节
        byte temp=bitmap[site];

        //获取该字节的第几个
        int i=number&7;//等价于 i=number%8
        //将0000 0001 左移(7-i)
        byte comp= (byte) (1<<(7-i));

        if(bool){//设置为1
            bitmap[site]= (byte) (comp|temp);//取或(0.. 1 0..)
        }else {//设置为0
            comp= (byte) ~comp;//取反
            bitmap[site]= (byte) (comp&temp);//相与(1.. 0 1..)
        }
    }

}

您必须 [ 登录 ] 才能发表留言!