Elias gamma code
1.简介
Elias gamma code 是一种用于正整数的通用编码,由Peter Elias发明。常被用于无法事先得知上界的正整数,即一种变长编码方式。
CocosBuilder的ccb文件中的整数正是采用了这种编码方式,被编码到了ccbi文件中(ccbi是二进制文件)。
在Cocos2dx引擎中,CCBReader利用了Elias gamma code 的解码方式,将ccbi文件中的整数解析出来。
2.名词解释
有效位:一个二进制数从左往右第一个为1的位及其之后所有位叫有效位,其余称无效位,如:0 000 1 0001
floor:向下取整,即[X,X+1)区间中的所有数都取X;
3.编码原理
我们都知道,int变量通常占4个字节(byte),每个字节8位(bit),共占32位,在计算机中以二进制存储。如果能剔除所有二进制数无效位,再将剩下有效位 紧密排列写进二进制文件里,就可以大大减少空间占用。这就是原理,很简单。
举个栗子:
剔除前:(17,11)10=(0000 0000 000 1 0001 ,0000 0000 0000 1011)2---->剔除后 (1 0001,1011)2
我们看到17的有效位个数为 5,无效位个数为27。11的有效位个数是 4,无效位个数是28。
然后对17和9剔除无效位,剔除后共占9位,剔除前,两个二进制数占了64位。
但是又考虑到解码时必须指明被编码了的有效位个数,不然解码器不知道应该读到哪一位为止。还要进行进一步处理,即在二进制数的 有效位 前 放置 [有效位个数-1] 个0,此时编码完成。
接着上面的例子,在17前加 4个0,在11前加 3个0。
(1 0001,1011)2---->编码结果:(0 000 1 0001, 000 1011 )2
最终,只用16位对原64位的两个数完成了编码。
4.解码原理
为什么加的0要比有效位个数少 1