最近有读者提问:听说腾讯QQ号码的理论最大值是43亿左右,那么用完后会怎样呢? 今天,来聊一聊与腾讯QQ号码相关的三个问题,相信大家会有一个比较完整的认识。QQ号的范围是多少?QQ号用完后会怎样?QQ号和bitmap渊源? 关于第一个问题,看完如下的有趣动图之后,肯定就会知道QQ号的最小值和最大值。 一。QQ号的范围是多少? 相信多数朋友都用过QQ,不过估计有些人很久没登录过了。你还记得自己的QQ号码吗?你知道QQ号码有多少位数吗?你知道QQ号码的大小范围吗? 别着急,我们会一一来解答。大家的微信号是字符串形式的,带有一些数字和字母,但QQ号是纯数字。在腾讯QQ后台的程序中,经常看到这样的代码:unsignedintuingetFromCookie(cookie,uin);if(uin10001){log。Error(invaliduinu,uin);returnINVALIDUIN;} 从这段简单的代码中,我们可以看出很多端倪。其中uin指代的就是QQ号码,有人说uin是unsignedint的缩写,有人说是userIDnumber的缩写。 不管怎样,uin表示的就是QQ号码,且是unsignedint类型,故QQ号就是4字节无符号整数,共32bit,也就是说,QQ号的取值范围是:〔0,2321〕 然而,这只是理论情况,从上面代码的判断可知,QQ号码的最小值是10001,为什么腾讯要做这种限制呢?其实没有为什么,仅仅是早期的一个设定而已。 对于QQ号码而言,从10001开始,号越小,就大致表明申请时间越早,是一个尊贵号。那么,10001是谁的QQ号呢?很容易猜,不过他实际不用这个号。 2321的值是4294967295,是一个10位的整数,大约是43亿,这就是QQ号码的理论最大值,你肯定没有见过11位的QQ号,至少目前是不可能存在的。 到目前为止,大家肯定就能理解下图中的数字含义了。在后续面试腾讯时,如果再问到QQ号码相关的问题,一定要意识到QQ号码的大小范围,会有帮助的。 二。QQ号用完后会怎样? 既然QQ号码的值是有范围的,那么自然有疑问:如果这么多QQ号码都被申请完后,结果会怎样呢?这是一个有趣的问题,但别替腾讯担心这些根本问题。 对于很多互联网公司而言,账号体系就是生命线,对腾讯尤其如此。最近几年,微信的势头超过QQ,QQ的月活远低于10亿,注册了的QQ也远小于43亿个。 所以,完全不用担心QQ号会超过43亿,在相当长的一段时间内,43亿是达不到的。而且,腾讯现在做了各种限制,并不会允许一个人无限地注册QQ号码。 另外,如果一个QQ号被注册了,但长期不登录,那么就相当于占着茅坑不拉屎,浪费资源。此时,腾讯也会考虑对QQ号进行回收,具体的逻辑就不说了。 然而,凡事总有万一,如果有一天QQ号码突破了43亿,那也可以,对腾讯来说,意味着业务蓬勃发展,也是好事。那么,QQ后台很多代码就需要重构了。 三。QQ号和bitmap渊源 在腾讯的面试题中,经常以QQ号码为背景进行考察。比如典型题目:文件中有40亿个QQ号码,如何进行去重? 如果没有敏感意识到使用bitmap,就是很糟糕很不应该的事情,说明基本没有好好去准备啊。bitmap图解如下: unsignedchar共8位,取值范围是〔0,255〕,这个unsignedchar的数值是255,能标识07这些数字都存在。 同理,如下这个unsignedchar类型的值是254,它对应的含义是:17这些数字是存在的,而数字0是不存的: 由此可见,一个unsignedchar类型的数据,可以标识07这8个整数的存在与否,这是很好理解的,以此类推:一个unsignedint类型数据可以标识031这32个整数的存在与否。两个unsignedint类型数据可以标识063这64个整数的存在与否。 说白了,也就是4B的内存,可以标识32个整数的存在与否。如果还不清楚的话,我来画个表格,逐步推演一下: 由此可见,512MB的内存大小,刚好可以用来标识所有的QQ号码的存在与否,一切迎刃而解。下面,我们看一下bitmap的程序,很好懂,也很实用,轻轻松松地实现了标记功能,顺便去重。defineN20考究019这20个数字defineSHIFT5defineMASK0x1funsignedinta〔1N32〕{0};设置第i位为1,让它处于点亮状态voidsetOne(inti){a〔iSHIFT〕(1(iMASK));}设置第i位为0,让它处于熄灭状态voidsetZero(inti){a〔iSHIFT〕(1(iMASK));}获取第i位的状态intgetState(inti){return(a〔iSHIFT〕(1(iMASK)))1;}intmain(void){把1,3,1,4,9,9,9这几个值的状态点亮,即状态为1setOne(1);setOne(3);setOne(1);setOne(4);setOne(9);setOne(9);setOne(9);inti0;for(i0;iN;i){couti对应的状态为:getState(i)获取状态}return0;} 编译运行一下,结果为:0对应的状态为:01对应的状态为:12对应的状态为:03对应的状态为:14对应的状态为:15对应的状态为:06对应的状态为:07对应的状态为:08对应的状态为:09对应的状态为:110对应的状态为:011对应的状态为:012对应的状态为:013对应的状态为:014对应的状态为:015对应的状态为:016对应的状态为:017对应的状态为:018对应的状态为:019对应的状态为:0 QQ号码和bitmap的渊源就是如此,以后在面试时,不可忽视bitmap的妙用哦,也希望大家看完这篇文章后,有所收货,心情愉快。 来源:https:mp。weixin。qq。coms?bizMzU2NTEyNjIzMwmid2247488299idx1snb53d3a768426e0d0b5ff547767e5ba53utmsourcetuicoolutmmediumreferral