|
|
1
34
如果你有18个字符在0-127范围内,一个数字在0-999范围内,并尽可能压缩它,那么它将需要17个字节。
您可以利用某些字符很可能未被使用这一事实。特别是不太可能有任何低于值32的字符,127也可能没有使用。如果你能再找到一个未使用的字符,那么你可以先把字符转换成基94,然后把它们尽可能地压缩成字节。
这个 可容纳16个字节! 示例代码
下面是一些用Python编写的示例代码(但是以非常命令式的风格编写,以便非Python程序员能够轻松理解)。我假设没有波浪线(
输出:
这个算法使用Python处理大量数据的能力。若要将此代码转换为C++,可以使用大整数库。 你当然需要一个等价的解码函数,原理是一样的-操作是按相反的顺序执行的。 |
|
|
2
5
这使得(18*7+10)=136位,或17字节。你写的
或者,来自另一个方向:你有128位的存储空间,你需要~10位的数字部分,所以还有118位的贸易数字。18个字符意味着118/18=6.555位每字符,这意味着你只能有空间编码2 6.555=94个不同字符**除非 trade\ num中有一个隐藏的结构,我们可以利用它来节省更多的比特。 |
|
|
3
2
假设您只需要
|
|
|
4
1
您可以在~~ 15字节(14字节和6位)内完成。
对于中的每个字符
让我们获取数字信息,每个字符可以是10个值(0到9)中的一个。 然后你必须有4位来保存这个字符,要保存数字你必须有1个字节和4位,然后你保存这个字符的一半。
如果你把数字保存为10字节的整数。你可以把它分成14字节和6位。 |
|
|
5
1
有 95 空格(0x20)和颚化符(0x7e)之间的字符(其他答案中的94个出现了off-by-1错误)。 因此,不同id的数目是95 18 ×1000 = 3.97×10 38 . 但这种压缩结构只能容纳(2 ) = 3.40×10 38 不同的值。 因此,不可能用该结构表示所有ID,除非:
|
|
|
6
1
关键问题是: 在你的帖子里似乎有些矛盾,不管是16个字符还是18个字符。你需要澄清一下。你说总数是21,由16+3组成-(
输出的16字节必须是可打印字符,还是基本上是二进制数? 更新原始帖子后编辑: 在这种情况下,如果输出可以是字符集中的任何字符,就有可能。如果只能打印字符,就不是了。 数学上的可能性的证明是很简单的。18个字符中的每个字符有94个可能值,3个字符中的每个字符有10个可能值。可能的组合总数=94^18*10^3~=3.28E35。这需要128位。2^127~=1.70e38,太小了,2^128~=3.40e38,够大了。128位是16字节,所以如果我们能使用每一个可能的位组合,它将几乎不适合。 考虑到紧密配合,我认为生成值的最实际方法是将其视为一个双长数,然后通过一个算法运行输入,为每个可能的输入生成一个唯一的整数。 从概念上讲,假设我们有一个16字节长的“大整数”数据类型。算法如下:
当然,我们在C中没有“巨大”的数据类型。你使用纯C还是C++?C++中没有大数类吗?对不起,我一段时间没有做C++了。如果没有,我们可以很容易地创建一个小库来实现一个巨大的。 |
|
|
7
0
如果它只能包含字母,那么每个字符的可能性就不到64个(26个大写字母,26个小写字母,剩下12个用于空格、终止符、下划线等)。如果每个字符有6位,你应该在15个字符内到达那里。假设你不支持特殊字符。 |
|
|
8
0
使用前10位作为3个字符的数字字符串(对这些位进行编码,就像它们代表一个数字一样,然后在解码时适当地填充零)。 好吧,这就剩下118位和16个字母数字字符要存储了。 0x00到0x7F(如果您的意思是包含在内)包含128个可能的字符来表示。这意味着每个字符可以由7位的组合来识别。提出一个索引,将这7位所代表的每个数字映射到实际字符。要用这种方式表示16个“字母数字”字符,总共需要112位。 我们现在有122位(或15.25字节)代表我们的数据。添加一个复活节彩蛋来填充剩余的未使用的位,您就拥有了16个字符的数组。 |
|
AstralHex · 矩阵乘法代码工作不正常 11 月前 |
|
|
Giogre · 为包含许多数值字段的简单“struct”重载比较运算符 11 月前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 11 月前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 11 月前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 11 月前 |