Algorithm 将10位值合并为唯一字节

Algorithm 将10位值合并为唯一字节,algorithm,binary,logic,byte,Algorithm,Binary,Logic,Byte,作为我正在编写的算法的一部分,我需要找到一种方法将10位字转换为唯一的8位字。10位字由5对组成,其中每对只能等于0、1或2(从不等于3)。例如: |00|10|00|01|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

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

|00|10|00|01|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
该值需要以某种方式合并为一个唯一的字节

因为每一对都不可能等于3,所以这个10位字永远不会代表一个大范围的值,这使我认为有可能创建一个算法来执行这个转换。最简单的方法是使用查找表,但存储680个值(在我的程序中只使用一次)似乎是浪费资源。我已经尝试过将其中一对组合成其他组合,但我所做的每一次尝试都产生了一个非唯一的值,现在我的想法很快就用完了


有什么帮助吗?

您的号码基本上是以3为基数的。您只需要将其转换为基数2

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

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

以你为例:

|00|10|00|01|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。

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

您正在考虑将一些信息存储在一个字节中。一个字节最多可以包含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之间。

是的,肯定是。我正在把它编程到一个微控制器上,所以我需要所有能节省的空间!!试试哈夫曼编码——该死的快手指:)