Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在4位二进制字符串中编码两个数字_Python_Algorithm_Operation - Fatal编程技术网

Python 在4位二进制字符串中编码两个数字

Python 在4位二进制字符串中编码两个数字,python,algorithm,operation,Python,Algorithm,Operation,例如,我有两个从0到15的数字。我想知道是否有任何方法可以将这两个数字编码为4位二进制字符串(或者可能是5位)?众所周知,表示0到15之间的任何单个数字都需要4位,但也许您可以考虑自己对二进制字符串的操作,然后从结果中恢复输入数字。例如,如果我添加0010+1011作为标准,我将得到1101。但是,由于相加的结果,不可能完全明确地预测总和的组成部分。必须考虑这些案件。但也许还有其他自己定义的行为?有人想知道这样的事吗 我知道上面的问题可能不符合某些门户条件,但纯粹抽象地对待这个问题:)您需要至少

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


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

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

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

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

如果您想在二进制字符串之间进行转换,可以执行以下操作:

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

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

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

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

如果您想在二进制字符串之间进行转换,可以执行以下操作:

>>> bin(188)
'0b10111100'
>>> int('0b10111100', 2)
188
(…)也许您可以考虑自己对二进制字符串的操作,然后从结果中恢复输入数字

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

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

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

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


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

您在寻找吗?有2^7种可能性,您想用2^4状态表示所有这些可能性?2^4<16+16,不可能将信息放入4位。2^5位具有所需的范围,您只需决定正确的编码。使用预定义的映射。然后您可以定义16对不同的数字,每对数字的范围为
(0..15,0..15)
。由于上述原因,您无法对所有可能的范围进行编码。你问的很像“我能在一页的一边和另一边写字。有第三面吗?”@deceze如何用5位来表示两个4位二进制数?例如(0101和1100),考虑到有16*16/2个唯一对?您正在寻找吗?有2^7个可能性,并且您希望以2^4状态表示所有这些可能性?2^4<16+16,不可能将信息拟合到4位。2^5位具有所需的范围,您只需决定正确的编码。使用预定义的映射。然后您可以定义16对不同的数字,每对数字的范围为
(0..15,0..15)
。由于上述原因,您无法对所有可能的范围进行编码。你问的很像“我能在一页的一边和另一边写字。有第三面吗?”@deceze如何用5位来表示两个4位二进制数?例如(0101和1100),考虑到存在16*16/2唯一对?或者,换句话说,您基本上尝试在4位中编码超过4位,这显然是行不通的。或者,换句话说,您基本上尝试在4位中编码超过4位,这显然是行不通的。