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

来源:互联网 发布:银行数据录入员好做吗 编辑:程序博客网 时间:2024/05/20 23:04
/* * 每个整型值 按照二进制算 有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);     }}
阅读全文
0 0
原创粉丝点击