不行啊,我主要是为了提高存储效率的可以经过转换把11位手机号码存储到int中的,我不知道怎么转换!因为我每天都有2000万个手机号码要存储,请再帮我想想,谢谢

解决方案 »

  1.   

    unsigned int 最大也值是4294967295,存不了应该是先能实现了,在考虑分析效率的提高吧
      

  2.   

    比如说,联通是130,131,132,133,153,156,可以取掉前三位存储到int,然后再还原过来就OK了比如,号码13112345678,我可以取掉13,把112345678存入int不就OK了
      

  3.   

    写个算法,压缩数字,如rar的压缩,读取时反相
      

  4.   

    to:shizhen(sToa) 老兄,还在吗?
    你的算法好象有点问题啊,用5位存储第2,3位 ,好象不够吧?
      

  5.   

    你非要用int来做那就用数组或链表按位存贮-----用字符串不行吗?
      

  6.   

    struct phoneNum
    {
    DWORD prefix:4;
    DWORD num:28;
    };
      

  7.   

    用int64吧,嘿嘿。还有一种办法,自己用字符集制作一个64进制或者更多的进制,再存成字符串,可以节约空间。第三个思路,如果你的手机号码固定是某个省的,可以想办法将前几位压缩。因为前几位是代表地区的。
      

  8.   

    我觉得没有必要在手机号码上做文章.
    一个int型占4字节,如果手机号码在数据库中用char(11)存储,占11字节。那么,2000万数据,11字节比4字节多出7*20000000字节空间。算一算也就是100多M而已。每天100多M,一年下来也就几十G,一般的电信业务,不会把号码保存那么就时间.如果非要扣硬盘空间,有2个办法:
    1是不要把号码存如数据库,直接存成文本文件,然后用rar压缩,可以压缩到比原来的十分之一还小.
    2是定期清理旧数据,把旧的数据从数据库删除然后保存成文件压缩,或着直接备份压缩数据库的数据文件.
      

  9.   

    用两个int
    或者
    一个一字节+一个int的,
    前3位9*9*9种可能,不考虑未来发展,一个字节也就够了(去掉现在不可能用的排列组合),考虑的话……256种…其实也够了,等不够的时候说不上是用什么拨号呢……(被不住不用数字……)
    后8位用int存储。
    不过参考内存寻址的方式,还是用两个int吧……
    lisunlin0(李林) 的方法也值得参考
      

  10.   

    用一个byte加一个int,总共就是五个字节
    前一部分为0~255
    后一部分为0~2147483647
    例如
    139 9999 9999
    这个号码就可以拆分为:
    13<>999999999
      

  11.   

    jun_01(寻深圳合作) 
    真会算帐啊~~~~
      

  12.   

    我在网上随便一搜,就找到了很多介绍11位手机号码含义的,大体上这样分:
    xxx-xxxx-xxxx,前三位好理解138,135,131,139.....我就不解释这是啥意思了,中间的4位是区段号,一般各个运营商通过这四位来区分全国不通地区的号码,最后4位就是你在所属区段的唯一ID了。
    然后我们再分析一下楼主的要求:
    int按照位来分是32位(在32位平台来讲,如果64位计算机那么一个int就是64 bit了),那么我们可以把这32位也分3个区段直接对应到某个手机号码上:
    第一区段:xxx,大可不必直接存130啦,138啦这样的数字,应该存一个代码,比如00代表130,01代表131.....这样就可节省空间,另外我不推荐将第一位的1忽略不记,因为万一哪天连通或者移动老总吃错药了憋出个230,231啥的号到时候这种设计就得哭了~~~目前全国最多也没见超过10种运营商代号,所以我们这里留6位(最多能存64个足够使用了)。
    第二区段:xxxx,这里也应该存一个地区代码而不是真正的数字,12位足够了(最多能存4096个)。
    第三区段:xxxx,用户唯一ID,没规律的数字,没啥说的给足14位(9999需要14位二进制表示)。这样,我觉得就应该能够解决楼主的问题了。
      

  13.   

    一个int 总共32位
    其中27位存储手机后面的八位数字 0x7ffffff = 134217727 表示的足够了
    剩下还有5位,能表示32种情况
    其中130-139是10种, 150-159是10种,这样一个int足够了.
      

  14.   

    struct number
    {
    unsigned int n1:5;
    unsigned int n2:27;
    };
      

  15.   

    搞不明白用int存手机号可以提高多少效率,纯属脱了裤子放屁。
      

  16.   

    用int不是好办法
    也不易于管理号码,还是弄个合适的结构体好些
      

  17.   

    感觉有点钻牛角尖。想当年,科学家是因为没办法,才用了两位数字的年份,带来了2000年问题;当时存储器实在是太珍贵了!现在,人家都不要 ASCII 了,人家都用 UNICODE 了。21世纪了,兄弟,你图啥啊???省吃俭用也不要省到这上边来啊!
      

  18.   

    支持 akirya(坏[其实偶不是什么所谓的坏人]) !
      

  19.   

    akirya说的不错啊,但是没听过用int存手机号码的,存了之后你不用检索么?
      

  20.   

    支持前面的struct phoneNum
    {
    DWORD prefix:5;
    DWORD num:27;
    };2^5 = 32            (130, 131..., 139, 158, 159... 共32各情况)
    2^27 = 13421 7728 > 0000 0000 (后8位足够用了)再有对LZ的存储效率不解,难道用的存储空间小就是效率高么?
      

  21.   

    检索好办啊,把要检索的号码,转换成一个int值
    用一个int做索引要比用字符串,两个int做索引快很多
      

  22.   

    int 存手机够了,大家都分析过了我也不说其它了
    只说一个效率问题,int的效率要远高于char* string就不说了
    就说赋值 int 只有一次内存传输, char* string都是字节为传输最小单元,所以有多少字节就传多少次。
    第二检索速度同样在一棵二叉上要比较一个字符串和一个字,相差多的去了就说只有四个字节的字符串,就要五次比较(最差),第好情况一次,而一个字无论好坏只要一次所以必要性不言而喻。只要代码麻烦点。
      

  23.   

    有一个简单的方法,采用64位的int来存,从字符串里面读入采用64位的atoi,取手机号码时用itoa,很方便的。
      

  24.   

    楼上的方法已经够多的了。好象总结下来有如下几点:
    1,使用字符串
    2,使用分段存储,只存储号码的一部分。
    3,使用int64
    等,后两中感觉都要改变程序存储结构,只有字符串还是比较实惠的。
      

  25.   

    手机号码的第一位都是1,可以不保存,这样剩下的用一个unsigned int本来就够了。
    偏偏中国移动又搞出一个159的号段来,唉