有没有办法使用半比特?


19

如大多数人所知,通过使用4位,我们可以从0到15进行计数(十六进制为0123456789ABCDEF)。但是,如果我们最多只能计数9个,那么我们仍将使用4位,并且会浪费从A到F的数字。

但是,维基百科的QR码页面指出,仅使用0到9的数字每个字符使用3个比特,从统计学的角度来看这是正确的。而且三分之一的位不是物理对象,据我所知,从0到9发送一个数字至少要使用4位。

有什么方法可以使用浪费的组合来有效地发送带有小数位的字符?

好,让我举个例子:必须发送两位数字“ 27”。使用普通的编码技术,发送的位将是00100111。然后我们可以想象一个系统,该系统将根据下一位将数字“ 2”替换为数字“ E”或“ F”。在这种情况下,下一位为0,因此将“ 2”替换为“ E”。然后将所得的比特串是1101 0 111.如果数字“28”必须被发送。另一方面,第一个位后的“2”是一个1,所以它是由位“F”替换代替,产生字符串1111 1 000。

在这两种情况下,都实现了1位的经济性,因为一个半字节被用于两个不同的字符。换句话说,每个字符使用三个半位。


2
对于在较小的数字空间中打包值有不同的看法,请查看三元计算机(en.wikipedia.org/wiki/Ternary_computer)如果对Knuth足够好,对我也足够好!
RLH 2014年

3
最好还是认识到您可以将其计算(10 * first_digit) + second_digit并编码为7位,表示0 ... 99,而代码100-127则留给其他东西。通过将3位数字压缩为10位,甚至可以节省更多。
热门点击2014年

要分别发送所有100个不同的值,最好的方法是将其打包为7位。如果您有更多的数字,包装将更有效。如果您要发送的值少于64个,则只能使用6位发送它
phuclv 2014年

Answers:


22

您不能发送一半,但是可以在传输或存储之前有效地将两个半位打包为一个位。

您自己举一个例子,因此您可以有效地回答“是”。

一种可能更简单的方法是将7位十进制数字的值简单编码。(二进制编码的双十进制排序)。


1
将数字对打包为7位的一种很好的用法是,当传输由大多数数字数据组成的ASCII文件时。低于128的任何字节值都表示一个ASCII字符,而128-227则表示两个ASCII数字。易于编码或解码,并且不需要数据包含大多数数字(甚至任何数字),但是可以非常轻松地将数字字符串压缩50%。
2014年

还是PDP11格式将3个字母数字字符打包为16位,而余下的是1位...
Brian Drummond 2014年

@BrianDrummond:一个人可以使用16位来存储40个字符集中的三个字符,或者存储39个字符集中的三个字符,但是不会有多余的位。通常,“字母数字”表示一组至少36个字符,但是唯一的备用方式是将组数限制为
32。– supercat

我以为是5位/字符。字母数字分为两个代码集,其中一个符号保留用于“交换代码集”。我错了:en.wikipedia.org/wiki/DEC_Radix-50虽然足够怪异,但是只有一个晚上,我不得不解码某人在CP / M系统上用8“软盘给我的报告,只有一个昏暗的地方Z80组件的回忆
布莱恩·德拉蒙德

19

您可以使用霍夫曼编码,以便数字具有不同的位长。如果您知道一个数字会比其他数字更频繁地出现,它将有所帮助。

示例(同等出现):

0-1111

1-110

2-110

3-101

4-100

5-011

6-010

7-001

8-000

获取数字1的接收端示例:

第一位进入,仅保留0到4作为选项。

第二位进来,仅保留0到2作为选项。

第三位进来,并将0保留为1。

第四位进来,传入号码为1


12

也许您正在寻找的是算术编码,它可以有效地编码一串符号,原则上每个符号都可能需要小数(非整数)个比特。(尽管总消息数必须是整数)

引用维基百科

算术编码与其他形式的熵编码(例如霍夫曼编码)的不同之处在于,算术编码将整个消息编码为单个数字,而不是将输入分成分量符号并用代码替换每个符号,分数n在其中(0.0≤n < 1.0)。


10

新的用于浮点运算的IEEE P754现在定义了二进制以外的十进制格式。其中一种编码建议将3位数字数字分组为10位。

使用10位= 1024个可能的代码对0到999进行编码非常有效,而且无论如何,十进制数字通常会按三组进行分组。

密集包装的十进制http : //en.wikipedia.org/wiki/Densely_packed_decimal


即使十进制数字被三组分组,正确的十进制浮点语义也可能要求(1)将尾数除以10的非三乘方幂,这意味着将所有组成部分乘以或除以10或100;(2)取决于(指数mod 3)某些位数可以用作数字的上部还是下部;(3)如果指数以1000为底数存储,则有时必须将三位数的最下一组四舍五入到最接近的10或最接近的100,而不是最接近的单位。
2014年

我个人认为,BigDecimal如果每个单词都保留9个十进制数字而不是32位,则类似的类型在许多情况下会更有效,但是舍入行为不应受到数字分组的影响。
2014年

4

二进制(或十六进制)的1:1对应仅是一个用于位的符号编码。是的,正如您所展示的,这是可能的。使用的另一个地方是(但略有不同)在通信系统的网格编码/解码中,在该系统中,将位转换保持更远的距离以便于解码。当然,8b / 10b和64b / 66b等编码也是类似的想法,其中在较小的冗余较大空间中编码较小的符号空间,以在子带中获得DC平衡,符号分离和控制代码。


4

数据表示形式取决于您或您的程序对它的解释。

例如,我们也可以将ASCII字符“ 27”发送为yield 0x3237 = 0b0011001000110111

xn(x)log2n(x)

x1,x2n(x1),n(x2)log2n(x1)+log2n(x2)log2(n(x1)n(x2))

2log2(10)=24=8log2(1010)=7

它总是取决于应用程序,但是通常,当您像建议的那样“联接”变量时,如果要对这些变量执行运算,则会消耗更多的计算能力。对“联接”变量进行加减运算比通常更为复杂,并且可能需要更多的硬件空间或导致更长的延迟。



2

打包值的常用方法是将每个值与其范围相乘,因此最终得到一个可以有效表示的位数。打开包装时,将按范围划分,其余的是数字,结果是剩余的包装数字。

如果您有0个到2个范围内的5个值,则可以用8位表示(至少需要7.92位表示值),而不是天真地使用每个值使用2位的方式使用的10位,通过做((((n 1 * 3 + n 2)* 3 + n 3)* 3 + n 4)* 3 + n 5


这种编码方法有名称吗?
Keegan Jay

1

从理论上讲,如果您愿意为高阻抗检测器花费电路空间和功率,则可以通过数字线(1、0和high-Z)发送3种状态。免责声明:这在模拟器中效果很好。我不知道该电路是否存在一些使其不切实际的问题,例如说它不能真正像普通的一对门一样快地切换。

我通常将信号从高Z信号过渡到信号(信号通常在硅中接地)的说法是半位信号。


1

您要发送一个十进制数字,需要3个位。但是您将必须使用4位,因为您不能发送三分之一。

因此,要找出3位的真正含义,您需要两个(或三个)3位的数字。如果要发送0到9之间的2(3)个十进制数字,每个数字都需要略少于3⅓位,则可以使用7(10)位进行发送。构造证明很容易:

7(10)位允许您对0到128(1023)之间的数字进行编码-但您只需要00(000)至99(999),它们都是可能的两位(三)十进制数字的编码。优质教育


1

我认为您误解了链接Wiki文章中的含义。是什么意思是,对字符的字符串是完全数字(没有空格,逗号或周期),使用理想压缩,可以表示使用3每个字符1 / 3上平均。实际上,这要比这好一点,因为从数学上讲,从长远来看,您可以获得log 2(10)= 3.3219位/字符。

同样,对于字母数字和一些符号(仅大写字母和9个符号)或45个字符的集合,您需要log 2(45)= 5.4918位/字符,在本文中四舍五入为5.5。

减少的位/字符可以通过压缩来实现,压缩方式可以是预设编码,也可以是QR标准指定的压缩方案(我不确定使用哪种压缩方案)。它代表一个字符需要进行编码的平均位数,因此单个字符将使用更多或更少的位进行编码。还应意识到上面列出的值是无限随机字符串的理想值。对于特制琴弦,可能会获得更好或更糟的压缩比。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.