求两个变量的最简表示方法

  • 假设有变量A,变量B,取值范围都是[0,99],且始终满足A<B

  • 要求:用尽量少的bit位来存储这两个变量,且能够相对容易地还原出A,B。

  • 一般的,7bit存A,7bit存B,共14bit可存储任何一种A、B的取值情况。

  • 但由于有A<B条件,所以理论上,通过枚举可以得出:只需4950种状态就可以表示所有A、B的取值情况,对这些状态逐个编号,最多13个bit位就可以容纳下这些编号,但此种方法还原困难。
    有没有其他方法呢?

你要最精简,就是枚举编号。采用数组存储对应关系,查表还原。

还原麻烦?怎么还原?你可以先将4950种状态按照顺序存放起来,存放的顺序可以是先A从小到大,然后B从小到大,比如
第一组0,1
第二组 0,2 1,2
第三组 0,3 1,3 2,3
.
.
第99组0,99 1,99......98,99
按照这个顺序存好了,查找和还原都很方便啊!根据A,B的值写个很简单的计算公式就能知道对应的存储位置了,或者根据存储位置也能知道对应的A和B的值

令a为6bit;b为6bit c为1bit,其中a根据情况可拆分为a1=3bit,a2=3bit,则可知a、b的表示范围为【0,63】,a1、a2的表示范围为[0,7],c为[0,1]。0<=A<**B**<=99;编码如下:

  • 当B>=64时,b=B-64;c=A>63?1:0;a=A-c*64;
  • 当36<=B<64时,b=B;c=1;a=A;
  • 当9<=B<36时,b=B+28;c=0;a=A;
  • 当0<B<=8时,b=36,c=0;a1=A;a2=B-1
  • 解码时
  • 当b+64<100时,A=c*64+a;B=64+b;
  • 当b+64>=100 且c=1时,B=b;A=a;
  • 当b+64>100 且c=0 时A=a;B=b-28;
  • 当b+64=100 且c=0 时,A=a1;B=a2+1;