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