快速的 log2的算法。

用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 
#include 
using namespace std;

namespace utility
{
	//- 工具函数,

	template 
	int	 to_int(PODType value)
	{
		int ret;
		std::stringstream _stream;
		_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 <

你可能感兴趣的:(游戏相关,算法)