golomb 变长编码算法
哥伦布编码的解析过程
golomb 编码主要是针对整数进行编码,减少整数使用的空间位数
在golomb编码时,有一个可以变化的参数m
本人的算法如下,很简便的!
int My_get_se_golomb_31()
{
int b = 0;
int nValue = 0;
b = My_get_ue_golomb_31();
nValue = b / 2;
if (b > 1 && b%2 ==0)
{
nValue = nValue * (-1);
}
return nValue;
}
int My_get_ue_golomb_31()
{
int b = 0;
int i = 0;
do
{
i ++;
if (i <32)
b = Bitstream_get(i,FALSE);
else
{
outlog("SPS: nreserved should is zero.");
break;
}
} while(!b);
Bitstream_get(i);
b = (1 <<(i - 1)) -1 + Bitstream_get(i-1);
return b;
}
http://ludajun.blog.sohu.com/
例如:取m = 1, 对整数x = 4进行编码, 算法如下
b = 2的m次方
q = int((x-1)/ b)
r = x - qb - 1
由此计算出 q = 1, r = 1
二进制编码为q 个 1, 1 个0, 然后是r的二进制编码
所以编码为:101
解码思路:
先算出所给整数的位数n
然后从高位--〉低位找到第一个0所在的位置i,这样就能 q = n - i, r = x的第0位到第i-1位所表示的数字(由低位--〉高位)
最终解码结果为qb + 1 + r
python 实现的 算法:
from math import log
m = 1
def compress(x):
q = (x - 1) >> m
r = x - (q << m) - 1
result = ((((1 << q) - 1) << 1) << m) | r
return result
def uncompress(x):
if x == 0:
return 1
#计算x的位数
n = int(log(x, 2))
if n == 0:
return x + 1
for i in range(n, -1, -1):
if (x & (1 << i)) == 0:
q = n - i
r = x & (1 << i - 1)
return r + 1 + (q << m)