set 采用十六位整数存储数值的java实现

/*
 * 每个整型值 按照二进制算 有16 位 两个字节
 * 
 * int[0] 就可以表示 0 -15  15则最后一位置1  例如8 就可以表示位 10000000 第九位 置1 
 * int[1] 就可以表示 16-31
 * int[2] 就可以表示 32-47
 *确定了最大的整数就可以确定存储的数组的大小了
 * */
public class Set {
     private int setrange;
     private int arraysize;
    public int member[];


     public  Set( int setrange) {
         this.setrange = setrange;
         arraysize = (setrange+15)>>4;//确定存储数组的大小 
         member = new int[arraysize];//初始化存储数组位0
         for(int i = 0; i < arraysize; i++) {
             member[i] = 0;
         }
     }
     int arrayIndex(int item) {
         return item >> 4 ; //一个整数存储 16个数字  除以16 确定 这个整数 位于member 的下标值
     }

     int bitMask(int item) {
        // print("bitMask:"+( 1 << (item&15)));
         //item&15  求与运算 求的 item 在0-15的哪个位置 例如33 求得值为1
         //1<<n 将第几位置1 
         return 1 << (item&15);
     }

     public void insert(int item) {
         if(item <  0 && item >= setrange) {
            System.out.println("out of  range");
             return;
         }
         //插入一个值 先取出 member[index] 中的值 与置1的位求并集
         //print("member["+arrayIndex(item)+"]");
         member[arrayIndex(item)] |= bitMask(item);
     }

     public void delete(int item) {
         if(item < 0 || item >= setrange) {
             System.out.println("out of  range");
             return;
         }
         //删除一个数 先将这个数的二进制位置0  然后求交集
         member[arrayIndex(item)]&=~bitMask(item);
     }


     //判断一个数是否存在 取出这个数置1 的二进制位的数 然后与 member[index]求交集
     public int isMember(int item) {
         if(item < 0 || item >= setrange) {
             System.out.println("out of  range");
             return -1;
         }
         return member[arrayIndex(item)]&bitMask(item);
     }


     public List<Integer> getList() {
                 List<Integer> list = new ArrayList();
         for(int i = 0; i < arraysize;i++) {
              if(member[i] !=0) {//如果member[i]不是0 说明里面存取了数值
                  for(int k=0; k <= 15; k++) {
                      //判断 0-15位是否 位1  如果是1 说明有值
                       int orValue = member[i]&(1<<k);
                    //   System.out.print("orValue:"+orValue+" ");
                       if(orValue != 0) {
                           list.add(16*i+k);
                       }
                  }
              }
         }
         return list;
     }

     //打印这个范围的数 所有存储进集合的数
     public void printSets() {
          for(int i = 0; i < setrange; i++) {
               int index = (i )>> 4;//查找位于第几个数组
          //    int memberflag =  member[arrayIndex(index)]&bitMask(i);
               if(isMember(i)!= 0) {
                    print(i+",");
               }
          }
     }
     private void print(String str) {
         System.out.println(str);
     }
}

猜你喜欢

转载自blog.csdn.net/gacmy/article/details/78291511