/*
* 每个整型值 按照二进制算 有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);
}
}
set 采用十六位整数存储数值的java实现
最新推荐文章于 2021-10-06 12:06:41 发布