2

作为我正在编写的算法的一部分,我需要找到一种方法将 10 位字转换为唯一的 8 位字。10 位字由 5 对组成,其中每对只能等于 0、1 或 2(从不等于 3)。例如:

|00|10|00|01|10|

这个值需要以某种方式合并为一个唯一的字节。

由于每对永远不会等于 3,因此这个 10 位字永远不会表示的值范围很广,这使我认为可以创建一种算法来执行这种转换。最简单的方法是使用查找表,但存储大约 680 个值似乎是一种资源浪费,这些值只会在我的程序中使用一次。我已经尝试过以某种方式将其中一对合并到其他对中,但我所做的每一次尝试都导致了一个非唯一的价值,我现在很快就没有想法了!

有什么帮助吗?

4

3 回答 3

5

您拥有的数字基本上是基数 3。您只需将其转换为基数 2。

有 5 对,所以 3^5 = 243 个数字。8 位是 2^8 = 256 个数字,所以这是可能的。

在基数之间转换的最简单方法是先转到基数 10。

因此,对于您的示例:

00|10|00|01|10

Base 3: 02012

Base 10: 2*3^3 + 1*3^1 + 2*3^0
       = 54 + 3 + 2
       = 59

Base 2:
    59 % 2 = 1
/2  29 % 2 = 1
/2  14 % 2 = 0
/2   7 % 2 = 1
/2   3 % 2 = 1
/2   1 % 2 = 1

   So 111011 is your number in binary

更详细地解释了上述过程。

请注意,一旦您在59上面存储了一个 1 字节整数,您可能已经拥有了您想要的东西,因此可能不需要显式转换为基数 2。

于 2013-09-05T10:41:39.117 回答
1

您基本上拥有的是一个基数为 3 的数字,并且您想将其转换为单个数字 0 - 255,幸运的是,三进制中的 5 个数字(基数为 3)提供 243 种组合。

你需要做的是:

Digit      Action
(  1st     x 3^4)
+ (2nd     x 3^3)
+ (3rd     x 3^2)
+ (4th     x 3)
+ (5th)

这将为您提供一个 0 到 242 的数字。

于 2013-09-05T10:44:14.897 回答
0

您正在考虑将一些信息存储在一个字节中。一个字节最多可以包含 2 ^ 8 = 256 个状态。

您的状态完全是 3 ^ 5 = 243 < 256。这使得转移成为可能。

考虑你的对是 ABCDE(每个字符可以是 0、1 或 2)

您可以只计算 A*3^4 + B*3^3 + C*3^2 + D*3 + E 作为结果。我保证结果将在 0 - 255 范围内。

于 2013-09-05T15:40:57.023 回答