快速的 log2的算法。

来源:互联网 发布:c 并发编程实践 pdf 编辑:程序博客网 时间:2024/06/11 05:35

用coco2d 的时候,看到读取ccbi文件。顺便研究了下。这个是mac 下 cocosbuilder 编辑完成以后发布的 2进制文件,windows 下没有工具打开。就稍微研究了一下格式,这东西里面坑真不少。以后研究透彻了在写博客记录下。

目前发现一个坑就是这里面的  INT 和UINT 值是用的 Elias gamma coding 具体可以看看 http://en.wikipedia.org/wiki/Elias_gamma_coding 这里。还有 http://blog.csdn.net/sonikk/article/details/8716529 特意研究的是CCBI中的 Elias gamma coding 算法。这篇文章里,作者用到了计算log2,他是用c的库函数的。想起很久一起那看到过的 快速的log2 的算法。查了一下资料,查了一下,就是把一个整数转换成浮点数,以float 为例,就是一个符号位,标记正负,8个指数为,还有剩下23个位数位。双精度的浮点数 double 也是如此,只是位数不同。具体可以看一下IEEE的浮点数标准。所以 整个log2的思路,就是把整数转换成浮点数,然后把指数为取出来,然后在计算一下指数为里有几个值就可以了。 英文网址 http://stereopsis.com/log2.html 这里 


贴一下代码 

#include <iostream>#include <sstream>using namespace std;namespace utility{//- 工具函数,template <typename PODType>int to_int(PODType value){int ret;std::stringstream _stream;_stream <<value;_stream >>ret;return ret;}};//-快速log2 的算法int fast_log2(int _val){int ret;float fdata = (float)_val;//unsigned int uData = (fdata>>23)&0xFF;//直接移动出错unsigned int data  = (unsigned int&)fdata;//(unsigned int&)fdata 与*(unsigned int*)&fdata; 一致unsigned int udata = (data>>23)&0xFF;ret = (int)udata -127;//-无符号到有符号return ret;}int main(int argc,char** argv){      int data = utility::to_int(argv[1]);        int log2_data = fast_log2(data);        cout <<"data: " << data <<" log2_data: "<< log2_data <<endl;        system("pause");        return 0;}

原创粉丝点击