【问题标题】:Consolidate 10 bit Value into a Unique Byte将 10 位值合并为一个唯一字节
【发布时间】:2013-09-09 03:21:45
【问题描述】:

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

|00|10|00|01|10|

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

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

有什么帮助吗?

【问题讨论】:

标签: algorithm binary logic byte


【解决方案1】:

您拥有的数字本质上是基数 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

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

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

【讨论】:

  • 该死的你的手指快:)
【解决方案2】:

您基本上拥有的是一个以 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。

【讨论】:

    【解决方案3】:

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

    您的状态完全是 3 ^ 5 = 243

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多