将两个或多个数字压缩为一个字节

Dav*_*ave 11 algorithm math

我认为这不是真的可能,但无论如何都值得问.假设我有两个小数字(每个范围从0到11).有没有办法可以将它们压缩成一个字节,然后再将它们取回.四个相似尺寸的数量如何呢?

我需要的是:a1 + a2 = x.我只知道x并从中得到a1,a2
对于第二部分:a1 + a2 + a3 + a4 = x.我只知道x并从中得到a1,a2,a3,a4
注意:我知道你不能解开,只是说明我的问题.

x必须是一个字节.a1,a2,a3,a4范围[0,11].

Dan*_*uev 12

这是微不足道的比特掩码.想法是将字节划分为更小的单元并将它们分配给不同的元素.

对于2个数字,它可以是这样的:前4位是number1,其余是number2.您将使用number1 = (x & 0b11110000) >> 4,number2 = (x & 0b00001111)检索值并x = (number1 << 4) | number2压缩它们.


Dav*_*d Z 9

对于两个数字,当然.每个都有12个可能的值,因此该对总共有12 ^ 2 = 144个可能的值,并且小于一个字节的256个可能值.所以你可以这样做

x = 12*a1 + a2
a1 = x / 12
a2 = x % 12
Run Code Online (Sandbox Code Playgroud)

(如果你只有签名字节,例如在Java中,它有点棘手)

对于从0到11的四个数字,有12 ^ 4 = 20736个值,因此您无法将它们放在一个字节中,但您可以使用两个数字.

x = 12^3*a1 + 12^2*a2 + 12*a3 + a4
a1 = x / 12^3
a2 = (x / 12^2) % 12
a3 = (x / 12) % 12
a4 = x % 12
Run Code Online (Sandbox Code Playgroud)

编辑:其他答案谈论每四位存储一个数字并使用位移.那更快.