位图的运算

//位图
//位图 如果要表示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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值