【问题标题】:Encoding two numbers in a 4-bit binary string在 4 位二进制字符串中编码两个数字
【发布时间】:2018-02-20 10:40:30
【问题描述】:

例如,我有两个从 0 到 15 的数字。我想知道是否有任何方法可以将这两个数字编码为 4 位二进制字符串(或可能是 5 位)?众所周知,需要 4 位来表示从 0 到 15 的任何单个数字,但也许您可以考虑自己对二进制字符串进行操作,然后从结果中恢复输入数字。例如,如果我添加0010 + 1011 作为标准,我得到1101。但是由于相加的结果,不可能完全明确地预测和的组成部分。必须考虑案例。但也许其他一些自己定义的动作?有人想知道类似的事情吗?

我知道上面的问题可能不符合某些门户条件,但是纯粹抽象地对待这个问题:)

【问题讨论】:

  • 您在寻找bin()吗?
  • 有 2^7 种可能性,你想把它们都表示成 2^4 种状态?
  • 2^4
  • 使用预定义的映射。然后你可以定义 16 对不同的数字,每一对都在(0..15,0..15) 的范围内。由于上述原因,您不能对所有可能的范围进行编码。你问的问题很像“我可以在页面的一侧和另一侧书写。有第三面吗?”
  • @deceze 如何仅用 5 位表示两个 4 位二进制数?例如(0101 和 1100),考虑到有 16*16/2 个唯一对?

标签: python algorithm operation


【解决方案1】:

您需要至少 8 位来编码从 0 到 15 的两个数字。这是因为您有 (2^4)*(2^4) = 2^8 个可能的输入(如果顺序无关紧要,则为 2^7 ),并且通过pigeonhole principle,您使用的任何小于 8(或 7)位的编码都会导致冲突,从而在所有情况下都无法重建您的输入。

要将两个 4 位数字编码为 8 位,只需将它们连接起来:

def encode(x,y):
    return (x << 4) + y

解码只需读取适当的位:

def decode(z):
    return z >> 4, z & 0xF

演示:

>>> encode(11,12)
188
>>> decode(188)
(11, 12)
>>> 

如果你想在两者之间转换为二进制字符串,你可以这样做:

>>> bin(188)
'0b10111100'
>>> int('0b10111100', 2)
188

【讨论】:

    【解决方案2】:

    (...) 也许你可以考虑自己对二进制字符串进行操作,然后从结果中恢复输入数字。

    不,如果您对操作数和结果使用相同的位数,这是不可能的。例如,使用 4 位,就像你说的,你有 16 个可能的值,从 0 到 15。如果你定义一个二元运算,假设它是可交换的(否则会更难),2-@ 的数量这 16 个元素中的 987654321@(可能的输入对的数量)是 120,这甚至没有计算两次使用相同输入的 16 种额外可能性。因此,如果您的结果中只有 16 个可能的值,则平均每个可能的结果将对应于 7 到 8 个可能的输入对。无论您定义什么操作,结果中至少需要 7 位才能重建输入。

    另一个问题是您是否可以确定产生某些结果的潜在输入集。例如,这对应于用于加法的 number partitioning 或用于乘法的 integer factorization 的概念。

    【讨论】:

    • 或者,换句话说,您基本上是在尝试在 4 位内编码超过 4 位,这显然是行不通的。
    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多