您的位置:首页 > 其它

快速的 log2的算法。

2013-11-08 00:03 597 查看
用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: