/**
* 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。
* 每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义
*
* <br>参考网址:http://www.cnblogs.com/dongxi/archive/2012/11/07/2759618.html
*/
public class BitMap {
//用char数组存储2-Bitmap,不用考虑大小端内存的问题 ,数组大小自定义
private static char[] flags = new char[1000];
/**
* 检查@idx是否已存在
* @param idx
* @return
*/
public static int get_val(int idx) {
/*
* | 8 bit |
* |00 00 00 00| //映射3 2 1 0
* |00 00 00 00| //表示7 6 5 4
* .
* .
* .
* |00 00 00 00|
*/
int i = idx / 4; //一个char 表示4个数
int j = idx % 4;
//0x3是0011 j的范围为0-3,因此0x3<<(2*j)范围为00000011到11000000
int ret = (flags[i] & (0x3 << (2 * j))) >> ( 2 * j );
return ret;
}
public static int set_val(int idx, int val) {
int i = idx / 4;
int j = idx % 4;
int tmp = (flags[i] & ~((0x3 << (2 * j)) & 0xff)) | (((val % 4) << ( 2 * j)) & 0xff);
flags[i] = (char) tmp;
return 0;
}
public static int add_one(int idx) {
int ret = get_val(idx);
if (ret >= 2)
return 1;
else {
set_val(idx, ret + 1);
return 0;
}
}
public static void main(String[] args) {
System.out.println(2>>3);
System.out.println(3>>2);
System.out.println(2<<3);
System.out.println(3<<2);
for (int i = 0; i < 8; i++)
System.out.println(i + " --> " + get_val(i));
// BitSet set = new BitSet(1000000000);
int a[] = { 1, 3, 5, 7, 9, 1, 3, 5, 7, 9, 1, 3, 5, 1, 3, 1, 10, 2, 4, 6, 8, 0 };
int i = 0;
System.out.print("所有数据:");
for (i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
add_one(a[i]);
}
System.out.print("\n只出现一次的数据:");
for (i = 0; i < 100; i++) {
if (get_val(i) == 1)
System.out.print(i + " ");
}
}
}
#include<stdio.h>
#include<memory.h>
unsigned char flags[1000];
unsigned
get_val(int idx)
{
int i = idx / 4;
int j = idx % 4;
unsigned ret = (flags[i] & (0x3 << (2 * j))) >> (2 * j);
return ret;
}
unsigned
set_val(int idx, unsigned int val) {
int i = idx / 4;
int j = idx % 4;
unsigned tmp = (flags[i] &~((0x3<<(2 * j)) & 0xff)) | (((val % 4) << (2 * j)) & 0xff);
flags[i] = tmp;
return 0;
}
unsigned
add_one(int idx) {
if (get_val(idx) >= 2)
return 1;
else {
set_val(idx, get_val(idx) + 1);
return 0;
}
}
int a[]= { 1, 3, 5, 7, 9, 1, 3, 5, 7, 9, 1, 3, 5, 1, 3, 1, 10, 2, 4, 6, 8, 0 };
int
main() {
int i;
memset(flags, 0, sizeof(flags));
printf("原数组为:");
for(i = 0; i < sizeof(a) / sizeof(int); ++i) {
printf("%d ", a[i]);
add_one(a[i]);
}
printf("\r\n");
printf("只出现过一次的数:");
for(i = 0; i < 100; ++i) {
if(get_val(i) == 1)
printf("%d ", i);
}
printf("\r\n");
return 0;
}