前言
相信大家都有过抢票、刷票的经验,每年年底,这都是一场盛宴。
然而,你有没有想过12306的抢票算法是怎么实现的呢?
没有吧,想过,还是没有头绪?
今天,我们就来曝光让人又爱又恨的12306是如何实现抢票的。
位运算回顾
我们知道计算机只能识别0和1,要操作这些0和1,只能通过位运算来进行,那么,一共有几种位运算呢?
让我们来回顾一下:
运算符号举例结果与& 1101
& 01100100或| 1101
& 01101111异或^ 1101
^ 01101011取反~11010010左移<<1101 << 111010带符号右移>>1101 >> 11110不带符号右移>>>1101>>>10110
以上位运算以Java为例,其他语言中可能没有 >>> 操作。
OK,位运算的简单回顾就到这里,还有不懂的同学可以自行百度一下。
位图
虽然大部分语言都有提供位运算,但是,并没有提供一种类似于位数组的类型,要使用这些位运算,我们只能通过数字类型来实现,比如Java中的int/long等类型。
而这些数字类型的数组,我们一般可以称之为“位图”(BitMap)。
比如,我们需要使用128位的内存,可以申请包含两个long类型的数组long[] bitmap = new long[2];。
不过,位图有什么用呢?
有大用处哦,比如,我们要统计某个用户一年的活跃度,就可以使用位图来实现。
一年有365天,一个long类型可以表示64位,365/64=6,只需要6个long类型就可以记录一个用户一年的活跃情况,怎么记录呢?
很简单,初始时,位图中所有位都是0,当这个用户某天登录了,就在位图中找到这天,把其位变成1,一年下来,这张位图就记录

最低0.47元/天 解锁文章
9266





