以利亚戴尔达码

✍ dations ◷ 2025-01-10 02:43:23 #数字,无损压缩算法

以利亚戴尔达码(Elias delta code)是一种用于正整数之通用编码。该码由 Peter Elias 发明。

对于待编码正整数 ≥1:

另一个等价的编码方式为:

要对 x {\displaystyle x} 进行编码,以利亚戴尔达码必须使用 log 2 ( x ) + 2 log 2 ( log 2 ( x ) + 1 ) + 1 {\displaystyle \lfloor \log _{2}(x)\rfloor +2\lfloor \log _{2}(\lfloor \log _{2}(x)\rfloor +1)\rfloor +1} 个比特。

以下为一编码对照表:

以利亚戴尔达码之解码遵循下列步骤:

举例:

0010100111. 最左方有兩個零位元 0012. 再讀取兩個位元 001013. 還原 00101 = 54. 再讀取 N = 5 − 1 = 4 個位元 0011 = 35. 解碼為 = 24 + 3 = 19

示例代码

编码

void eliasDeltaEncode(char* source, char* dest){    IntReader intreader(source);    BitWriter bitwriter(dest);    while (intreader.hasLeft())    {        int num = intreader.getInt();        int len = 0;        int lengthOfLen = 0;        for (int temp = num; temp > 0; temp >>= 1)  // calculate 1+floor(log2(num))            len++;        for (int temp = len; temp > 1; temp >>= 1)  // calculate floor(log2(len))            lengthOfLen++;        for (int i = lengthOfLen; i > 0; --i)            bitwriter.outputBit(0);        for (int i = lengthOfLen; i >= 0; --i)            bitwriter.outputBit((len >> i) & 1);        for (int i = len-2; i >= 0; i--)            bitwriter.outputBit((num >> i) & 1);    }    bitwriter.close();    intreader.close();}

解码

void eliasDeltaDecode(char* source, char* dest){    BitReader bitreader(source);    IntWriter intwriter(dest);    while (bitreader.hasLeft())    {        int num = 1;        int len = 1;        int lengthOfLen = 0;        while (!bitreader.inputBit())     // potentially dangerous with malformed files.            lengthOfLen++;        for (int i = 0; i < lengthOfLen; i++)        {            len <<= 1;            if (bitreader.inputBit())                len |= 1;        }        for (int i = 0; i < len-1; i++)        {            num <<= 1;            if (bitreader.inputBit())                num |= 1;        }        intwriter.putInt(num);            // write out the value    }    bitreader.close();    intwriter.close();}

一般化

以利亚戴尔达码并不适用于零或负整数。一个一般化的方式是在最左侧先加一个一比特,解码时再行扣掉。另一个方法是在编码前将所有整数映射至正整数,例如:(0, 1, −1, 2, −2, 3, −3, ...) 对应至 (1, 2, 3, 4, 5, 6, 7, ...)。

相关

  • 惊恐发作恐慌发作(Panic attack)的意义为患者在强烈恐惧下,表现出一系列的身心症状。(常见换气过度或气喘)当恐慌发作,患者会感受到强烈不适,因此常求助于急诊室。一个人在一生中可能出现极
  • 夹钳夹钳是一种紧固装置,它通过使用内部压力,将物体紧紧把持在一起,防止其移动或分开。夹钳的种类很多,它们被用于各种不同的场合。有些是临时性的,比如将组件固定在一起时定位用;其它
  • 原口类动物原口动物(学名:拉丁语:Protostomia),又名前口动物或旧口动物,有完整的消化道。胚胎时期的原口会发展为成体的口,而肛门则是另外形成的。蜕皮动物(Ecdysozoa)和螺旋动物(Spiralia)都属于
  • 马克斯·恩斯特马克斯·恩斯特(德语:Max Ernst,1891年4月2日-1976年4月1日),德国画家、雕塑家、图像艺术家及诗人。作为一名多产的艺术家,恩斯特是达达运动和超现实主义运动的主要领军人物。马克
  • 南约克南约克郡(英语:South Yorkshire),英国英格兰约克郡-亨伯的郡,有1,292,900人口,占地1,552平方公里。在1974年4月1日起成为名誉郡、都市郡。以人口计算,谢菲尔德是第1大(亦是唯一一个)
  • 业余爱好者业余爱好者(来自拉丁语amatorem及法语amateur),一般指未经正式学习或培训,而对某种活动有特别的热情,对此有研究或已经拥有技术的人。与专业人士不同的是,业余爱好者一般不会从爱
  • 安德尔斯霍芬魏尔湖坐标:47°47′12″N 9°10′40″E / 47.786568°N 9.177727°E / 47.786568; 9.177727安德尔斯霍芬魏尔湖(德语:Andelshofer Weiher),是德国的湖泊,位于该国西南部,由巴登-符腾堡州
  • 张大宗张大宗(1872年-1925年),字栋臣。清末军事将领。江苏海州(今属连云港)人。武榜眼及第。光绪十九年(1893年)癸巳恩科本省乡试中式武举人,光绪二十一年(1895年)乙未科会试中式武进士,殿试钦
  • 角犀鸟属角犀鸟属(学名:),犀鸟目犀鸟科的一属,为分布在亚洲的大型犀鸟。角犀鸟属的物种如下:钢盔犀鸟有时也会被分类在此属中,但现今大部分的学者都会将之分类在其单型的盔犀鸟属。
  • 叶尚福叶尚福(1938年12月14日-),四川成都人,微波天线专家,中国工程院院士。1995年,获选中国工程院信息与电子工程学部院士。