仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1036|回复: 9
打印 上一主题 下一主题

[CentOS(社区)] 带来一篇Lua疾速盘算log2

[复制链接]
精灵巫婆 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:34:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
欢迎大家来到仓酷云论坛!lua的源码,欣喜愈来愈多。好比明天看到了一个疾速盘算log2(x)的***。代码以下:
intluaO_log2(unsignedintx){
staticconstlu_bytelog_2[256]={
0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
};
intl=-1;
while(x>=256){l+=8;x>>=8;}
returnl+log_2[x];
}




设法也很朴实,就是把整数转换成2^n的情势,然后求出n就能够了。好比256是2^8,以是这里数组log_2[256]=8,那些转换不成2^n的数也就被近似盘算了,好比255,我们晓得256=2^8,而128=2^7,以是128和256之间的数都被近似成256了,了局也都是8。我们能够看到log_2[128]到log_2[255]都即是8。
这里偏差也就是1。完整能够疏忽了。假如这个数年夜于256,那末就让他除以256,同时了局加8就能够了。最初的偏差仍旧是1。
实在你也完整能够把这个log_2的数组计划的更年夜一些,如许必要进进while轮回的前提就请求所求的数更年夜。作者定在256估量是思索到在实践盘算过程当中关于年夜于即是256的数求log2已很罕用到了。这个log_2的数组你还能够计划的更公道一些,好比把log_2[128]到log_2[255]之间的数不全体设成8,而是把接近128的中央的数设成7,把接近255的中央设成8,不外如许就又堕入到更贫苦的思索中,好比究竟把那里入手下手设成8,那里设成7等等。原本是为了疾速盘算的一个函数,最初又变贫苦,一定欠好。

最初我在网上搜刮疾速盘算log2的***的时分又看到了QuakeIII中的奇妙代码。我不能不说,QuakeIII真是一个奇妙的引擎,内里有大批值得进修的代码,等我浏览完lua的源码以后下一步就是浏览它了。先来看看它是怎样举行log2盘算的:


staticconstintdebruijn[32]={
0,1,28,2,29,14,24,3,30,22,20,15,25,17,4,8,
31,27,13,23,21,19,16,7,26,12,18,6,11,5,10,9
};
#defineLOG2(X)(debruijn[((Uint32)(((X)&-(X))*0x077CB531U))>>27])




看到这段代码我至心都快被吓尿了。起首我只晓得(x)&(-x)的意义是掏出x开端的0和第一次呈现的1。其他我就一概不了然。最奇妙的是这内里又呈现一个magicnumber0x077CB531U。前次在QuakeIII里看到的谁人牛顿转换的初始值的谁人magicnumber的时分我就尿了。此次不破例。还幸亏网上看到了Matrix67给出的注释,不外没有细心看,等过段工夫再看看。

Lua:lobject.c
QuakeIII:trick代码
Matrix67:奥秘常量复出!用0x077CB531盘算开端0的个数
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的小伙伴们!
蒙在股里 该用户已被删除
沙发
发表于 2015-1-16 20:47:21 | 只看该作者

带来一篇Lua疾速盘算log2

Linux简单,占内存少,特别是对于程序开发人员来说很方便,如果说windows的成功在于其方便用户的窗口管理界面。
再现理想 该用户已被删除
板凳
发表于 2015-1-19 17:52:10 | 只看该作者
得到到草率的回答或者根本得不到任何Linux答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。
兰色精灵 该用户已被删除
地板
发表于 2015-1-28 09:27:22 | 只看该作者
下面看看一个让人无法回答的问题:“救命各位高手,向你们请教一些问题:如何在Linux下配制HTTP、FTP、Samba、DNS、DHCP、Sendmail服务器,谢谢”这样的问题。
活着的死人 该用户已被删除
5#
发表于 2015-2-5 20:32:25 | 只看该作者
以前觉得Linux就跟dos一样,全是用命令窗口,相对于窗口界面来说多麻烦呀。
乐观 该用户已被删除
6#
发表于 2015-2-13 13:28:41 | 只看该作者
学习Linux半年了~个人认为不会的多在网上找资料网上有很多资料可以搜索到,LS那位说放手去搞。
admin 该用户已被删除
7#
发表于 2015-3-3 22:24:30 | 只看该作者
目前全球有超过一百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,RedhatLinux和DebianLinux是网络管理员的理想选择。
再见西城 该用户已被删除
8#
发表于 2015-3-11 14:42:11 | 只看该作者
上课传授的不仅仅是知识,更重要的是一些道理,包括一些做人的道理,讲课时也抓住重点,循序渐进,让同学理解很快;更可贵的是不以你过去的成绩看问题.
不帅 该用户已被删除
9#
发表于 2015-3-19 02:10:06 | 只看该作者
通过自学老师给的资料和向同学请教,掌握了一些基本的操作,比如挂载优盘,编译程序,在Linux环境下运行,转换目录等等。学了这些基础才能进行下面的模拟OS程序。?
10#
发表于 2015-3-27 04:09:03 | 只看该作者
Linux是参照Unix思想设计的,理解掌握Linux必须按照Unix思维来进行。思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-29 13:19

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表