欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用位图法记录用户在一个月内的活跃情况

程序员文章站 2022-06-12 19:50:07
...

当我们在某些情况下,比如需要记录一个用户在某个月内哪一天上线了这种情况。氮素那,如果用户数量大(百万级用户),记录信息量少(只有上线没上线两种情况)。这种情况下的记录如果使用传统的面向对象的方式保存就很浪费空间了。

那么怎么存才能使信息记录准确但是又占用空间少呢?可以使用2进制的方式保存嘛。

二进制只有两种值的类型(0,1),用户情况也只有两种类型(上线、没上线)。

需要记录一个月内的用户情况,int类型有32位,正好够用。

好!(语出我闺女)

决定了!

就用他了!

话又说回来了,怎么操作二进制数据那。

也就那几种啦。简单简单,一点也不难。使用位运算符即可

“与”、“非”、“或”、“异或”。

1.与运算符
与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为1,结果才为1,否则结果为0。

2.或运算符
或运算符用符号“|”表示,其运算规律如下:
两个位只要有一个为1,那么结果就是1。

3.非运算符
非运算符用符号“~”表示,其运算规律如下:

如果位为0,结果是1,如果位为1,结果是0。

4.异或运算符
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。


除了使用上述操作之外还需要用到当前是哪一天啊。

java中有三种移位运算符

<<      :     左移运算符,num << 1,相当于num乘以2

>>      :     右移运算符,num >> 1,相当于num除以2

>>>    :     无符号右移,忽略符号位,空位都以0补齐

那么准备工作做完了。

我们在操作的时候首先把当前日期对应的位置置1,其他位置置0。

然后取得用户的活跃信息,把用户活跃值与日期数字相或。因为日期数字除了日期位其他都是0,所以除了日期位之外,用户信息其他位数字保持不变。只有对应当前日期的值受到影响。然后保存这个值。这样就大功告成啦。

比如某人1号上线,那么他对应的活跃信息就是0001,如果1、3号上线,2号没上,那么他对应的活跃信息就是0101。 

代码如下

	int t = 1;//日期
	int t2 = 0;//用户信息
	t = t << 1;//过了一天,日期位左移一位
	t2 = t | t2;//用户今天活跃了,把代表今天的位置置1
	System.out.println(Integer.toBinaryString(t2));

困扰我们多时的问题这简单就解决了,是不是很简单啊。哈哈哈