//位图 //位图 如果要表示int 数组 100个 我们需要new int[]{xx,xx,xx,xx} 一个int 4个字节 100个就是占400个字节 //如果用位图 用二进制来代表。 比如 int 是占32位 可以表示0--31的数字。100 如果用位置表示就是 (100+32)/32=4 //我们可以用 int[4] 就可以表示了 只占16个字节 这就是位图的效果 //long 是8个字符 占64位 。下面就用long做例子吧 @Test void contextLoads(){ //实现 增加 删除 查找 int max=100;int num=10; //(max+64)>>6 就是 (max+64)/2的6次方 //0000 0000 0000 0000 0000 0000 1010 0100=164 //0000 0000 0000 0000 0000 0000 0010 0000 //0000 0000 0000 0000 0000 0000 0000 0010=2 long[] bits=new long[(max+64)>>6]; System.out.println(50%64); //add add(bits,num); //查看是否还存在 boolean flag= contians(bits,num); System.out.println(num+"这个数字是否存在:"+flag); //delete delete(bits,num); flag= contians(bits,num); System.out.println(num+"这个数字是否存在:"+flag); } public void add(long[] bits,int num){ //假设 来的num 是50 50/64=0 50%64=50 //num & 63= num%64 // | 或运算 是有1 为1 num&63=num%64==50 那就设置第50位位1 或运算 可以设置 bits[0] 这个数的 第50位是1 bits[num>>6] = bits[num>>6] | (1L << (num&63)); //bits[num>>6] |= (1L << (num&63)); } public void delete(long[] bits,int num){ //删除 就是设置他为0 我们用 与运算 那一个0去与 他对应的位置 bits[num>>6] =bits[num>>6] & ~(1L << (num&63)); //第50位是1 我们用与运算(同1为1 其他为0 ) 所以我们取反 让第50位为0 //bits[num>>6] &= ~(1L << (num&63)); } public boolean contians(long[] bits,int num){ //判断这个数字是否存在,先找到他在那个数组中 //然后找到这个数组的位置 第50位 我们用与运算 如果bits存在为1 结果返回非0 就是表示存在 其实他结果会返回对应的值 可以试试 System.out.println("与运算返回的内容2的"+num+"次方:"+( bits[num>>6] & (1L << (num&63)) )); return ( bits[num>>6] & (1L << (num&63)) ) !=0; }
位图的运算
最新推荐文章于 2025-02-09 12:30:22 发布