MQ编码器来自于无乘法的Q编码器算法;而另一来自Q编码器的算法是QM,这两个编码器的区别有:
1. QM是LPS区间在上,MPS区间在下,而MQ正好相反,LPS区间在下,而MPS区间在上。
2. QM编码器采用的是全进位模式,而MQ的是位填充模式。
如图:
上图中发现MQ编码器的MPS和LPS的区间位:
MPS区间: Qe-A
LPS区间:0-Qe
MQ编码器的规则:
1. 如果遇到一个MPS
a) 首先将A = A-Qe;这个是MPS的区间大小
b) 如果A大于0x8000的时候,说明不需要重定标;需要将MPS的下界放到输出符号C中,即:C = C+A
c) 如果A小于0x8000,说明需要重定标;这个时候需要比较一下A与Qe的大小,如果A比Qe小还需要交换区间
d) 如果A比Qe小,首先需要将Qe的值给A,也就是A =Qe;这个时候不需要输出区间边界,因为交换之后的MPS区间的下界实际上是原来LPS区间的下界,其是0。
e) 如果A比Qe大,这个过程同b,需要将MPS的区间下界Qe输出到C中
f) 对于小于0X8000的情况需要重定标,也就是逐次加倍增加A和C,直到A比0x8000大;如果中间的C发生溢出,需要输出C的高位到输出字节。
2. 如果是LPS,那么重定标是肯定的,在完成所有操作后进行
a) 如果A比Qe小;这个时候实际上A仍然是MPS的区间,单由于遇到了一个LPS,最终的A应该是LPS区间,大MPS的区间(现在的A)比LPS的区间(Qe)小,所以取两者小的那个,所以A已经是值了。这实际上是一次区间交换。而交换后的LPS区间下界是交换前的MPS区间下界,也就是Qe,因此将Qe输出到C。那么C = C + Qe
b) 如果A比Qe大,说明这是一个不需要交换的区间,但这个时候需要将LPS的区间给A,而且将LPS的区间下界输出到C;对于LPS的区间是Qe,因此A = Qe;而LPS的区间下界是0,所以C没有变化。
完成上面步骤以后需要进行A和C的重定标,直到A比0X80000大为止。
对应QM编码器可以参见QM编码器 MQ编码器
代码下载。