初级--06---位图

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初级--06---位图相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


位图

定义:

  • 位图,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。

  • 位图,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的

>> 6的含义

>> 6 等于 /64

右移6位 等同于 除以64,也就是除以 2^6的意思

取模运算 转化为 位运算

若满足b为2的整数次幂(即b=1<<k,k为整数)时,可用一个特殊的小技巧将取模运算转化为位运算,

a%b = a&(b-1) ,且b=1<<k(k为整数)

位运算 比加减乘除,取模效率上高很多

位图的实现

1. 构造函数:

max 为需要存储的元素个数和

// 这个类的实现是正确的
	public static class BitMap 

		private long[] bits;

		public BitMap(int max) 
			bits = new long[(max + 64) >> 6];
		
	

  • 一个long类型的数字,可以存64位数字
  • (max + 64) >> 6 看需要多少个long类型的数字

2. add操作

 public void add(int num) 
 	bits[num >> 6] |= (1L << (num & 63));
 
  • num >> 6 判断是第几个long类型的区间
  • 取模64 等于 (num & 63) 看 对应区间的 具体哪个位置上

将对应的比特位置赋值为1

位或运算

bits[num >> 6] = bits[num >> 6] | (1L << (num & 63));

bits[num >> 6] |= (1L << (num & 63));

3. delete操作

public void delete(int num) 
			bits[num >> 6] &= ~(1L << (num & 63));

将对用的比特位置0操作

4. contains操作

public boolean contains(int num) 
			return (bits[num >> 6] & (1L << (num & 63))) != 0;
		

判断对应的比特位是0(不存在)还是1(存在)

总代码

public static class BitMap 

		private long[] bits;

		public BitMap(int max) 
			bits = new long[(max + 64) >> 6];
		

		public void add(int num) 
			bits[num >> 6] |= (1L << (num & 63));
		

		public void delete(int num) 
			bits[num >> 6] &= ~(1L << (num & 63));
		

		public boolean contains(int num) 
			return (bits[num >> 6] & (1L << (num & 63))) != 0;
		

	

测试

public static void main(String[] args) 
		System.out.println("测试开始!");
		int max = 10000;
		BitMap bitMap = new BitMap(max);
		HashSet<Integer> set = new HashSet<>();
		int testTime = 10000000;
		for (int i = 0; i < testTime; i++) 
			int num = (int) (Math.random() * (max + 1));
			double decide = Math.random();
			if (decide < 0.333) 
				bitMap.add(num);
				set.add(num);
			 else if (decide < 0.666) 
				bitMap.delete(num);
				set.remove(num);
			 else 
				if (bitMap.contains(num) != set.contains(num)) 
					System.out.println("Oops!");
					break;
				
			
		
		for (int num = 0; num <= max; num++) 
			if (bitMap.contains(num) != set.contains(num)) 
				System.out.println("Oops!");
			
		
		System.out.println("测试结束!");
	

以上是关于初级--06---位图的主要内容,如果未能解决你的问题,请参考以下文章

[AndroidStudio]_[初级]_[配置自动完成的代码片段]

[AndroidStudio]_[初级]_[配置自动完成的代码片段]

Android - 片段中的 getIntent()

如何从Android片段中的相机获取图像

将位图从片段保存到内部/外部存储[关闭]

如何在两个片段之间传递位图? (我正在使用 Android 导航组件)