不行啊,我主要是为了提高存储效率的可以经过转换把11位手机号码存储到int中的,我不知道怎么转换!因为我每天都有2000万个手机号码要存储,请再帮我想想,谢谢
解决方案 »
- 程序运行中如何获取Edit控件上的值
- 写入数据库问题?(菜鸟问题)
- 【求教】在自己设计的类当中获取当前视图对象指针
- activeMovie控件如何设置和获取控件大小
- 求助,多客户端对sql server服务器操作的程序真么做,请给点建议.没有的也来看看,都有分
- 关于CScrollView类中如何设置原点
- FindFirstFile()中 LPCTSTR lpFileName支持通配符吗?
- 菜鸟又来了:用VC++编程,怎样联接到SQL服务器上,并操作它里面的数据库?
- 一个程序如何重启自己?
- 我在学WinSocket,请问现在外面WinSocket吃香吗?一般做什么东西要用WinSocket的?找的到工作吗?还有Qos,RAS是什么东西?有人学吗?好象和编程不搭架的?
- 100分求vc实现客户端自动更新的源代码和文档
- 编译Directshow Samples 遇到问题
你的算法好象有点问题啊,用5位存储第2,3位 ,好象不够吧?
{
DWORD prefix:4;
DWORD num:28;
};
一个int型占4字节,如果手机号码在数据库中用char(11)存储,占11字节。那么,2000万数据,11字节比4字节多出7*20000000字节空间。算一算也就是100多M而已。每天100多M,一年下来也就几十G,一般的电信业务,不会把号码保存那么就时间.如果非要扣硬盘空间,有2个办法:
1是不要把号码存如数据库,直接存成文本文件,然后用rar压缩,可以压缩到比原来的十分之一还小.
2是定期清理旧数据,把旧的数据从数据库删除然后保存成文件压缩,或着直接备份压缩数据库的数据文件.
或者
一个一字节+一个int的,
前3位9*9*9种可能,不考虑未来发展,一个字节也就够了(去掉现在不可能用的排列组合),考虑的话……256种…其实也够了,等不够的时候说不上是用什么拨号呢……(被不住不用数字……)
后8位用int存储。
不过参考内存寻址的方式,还是用两个int吧……
lisunlin0(李林) 的方法也值得参考
前一部分为0~255
后一部分为0~2147483647
例如
139 9999 9999
这个号码就可以拆分为:
13<>999999999
真会算帐啊~~~~
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位二进制表示)。这样,我觉得就应该能够解决楼主的问题了。
其中27位存储手机后面的八位数字 0x7ffffff = 134217727 表示的足够了
剩下还有5位,能表示32种情况
其中130-139是10种, 150-159是10种,这样一个int足够了.
{
unsigned int n1:5;
unsigned int n2:27;
};
也不易于管理号码,还是弄个合适的结构体好些
{
DWORD prefix:5;
DWORD num:27;
};2^5 = 32 (130, 131..., 139, 158, 159... 共32各情况)
2^27 = 13421 7728 > 0000 0000 (后8位足够用了)再有对LZ的存储效率不解,难道用的存储空间小就是效率高么?
用一个int做索引要比用字符串,两个int做索引快很多
只说一个效率问题,int的效率要远高于char* string就不说了
就说赋值 int 只有一次内存传输, char* string都是字节为传输最小单元,所以有多少字节就传多少次。
第二检索速度同样在一棵二叉上要比较一个字符串和一个字,相差多的去了就说只有四个字节的字符串,就要五次比较(最差),第好情况一次,而一个字无论好坏只要一次所以必要性不言而喻。只要代码麻烦点。
1,使用字符串
2,使用分段存储,只存储号码的一部分。
3,使用int64
等,后两中感觉都要改变程序存储结构,只有字符串还是比较实惠的。
偏偏中国移动又搞出一个159的号段来,唉