从两个字节创建最小的唯一编号

时间:2010-08-18 12:03:49

标签: algorithm

众所周知,字节范围是0到255
我有两个字节,我想创建另一个可逆的数字,但最小长度组合这两个数字并创建一个新的,最简单的解决方案是

a = b1 * 1000 + b2

反向将是

b1 = a / 1000
b2 = a%1000

上述解决方案的长度变化0到6长度,我想要一个具有FIXED和最小长度的公式

3 个答案:

答案 0 :(得分:5)

编码:

x = b1 * 256 + b2;
x = x + 10000;

解码:

x = x - 10000;
b1 = x >> 8;
b2 = x & 255;

编码结果的长度始终为5(包括1000075535。并且由于存在65536个不同的对(b1,b2),因此无法将它们编码为长度< 5(因为最多有10000个这样的数字)。

答案 1 :(得分:1)

这里最简单的通用解决方案是

a = b1 * 256 + b2;

又名

a = (b1 << 8) | b2;

然后让他们回来(假设你有无符号字节可用):

b1 = (a >> 8) & 0xff;
b2 = a & 0xff;

除非您认为b1=0, b2=*的结果为一个字节(因为每个值小于256),否则将为所有输入生成一个2字节的值。您可以潜在交错,这样每个输入字节的低4位最终会在输出的低8位中结束,因此您最终得到的值小于256( b1 < 16, b2 < 16)。坦率地说,最简单的方法就是将其视为2字节值,使用上述移位。

使用2个字节显然是最小的,并且很容易实现。

如果这不是您想要的,请提供更多信息。

编辑:我一直在假设您正在寻找一个固定的二进制长度。如果你想要一个固定的十进制长度,请使用falagar的解决方案。

答案 2 :(得分:1)

如果您的意思是以十进制表示的固定长度数字,您可以使用:

a = 100,000 + b1 * 256 + b2

这将为您提供100,000到165,535之间的数字。

要扭转操作:

b1 = (a - 100,000) / 256
b2 = (a - 100,000) % 256