提问人:Bi Bi 提问时间:10/30/2022 更新时间:10/30/2022 访问量:30
JAVA:保存编码为数字的字符串(不是 parseInt)
JAVA: saving a string encoded into a number (not parseInt)
问:
我想知道是否有办法将字符串转换为要存储的数字(不是 parseInt)。
比如说,我有一个用户输入一个字符串,有没有办法把它转换成一个特定的数字?稍后,该数字可以被解释并打印回相同的字符串吗?"Some characters here and 12234"
我考虑过将其实现为 ASCII 字符,但 ASCII 字符要求每个字符 1 个字节,但我的数字只有 16 位长(短)。
有关详细信息,我正在实现一个基本的计算机模拟器,并尝试实现简单的 I/O 指令。这些数字将存储到大小为 16 位的寄存器中。 问题是指令格式是固定的,即“IN reg, device”或“OUT reg, device”。如果我使用 ASCII,则 reg 一次只能保存 2 个字符,那么我将不得不将其保存到我们的虚拟内存中,但指令中没有指示它在内存中的位置。
答:
你想要的在数学上是不可能的,通过鸽子洞原理。想象一下,你在一个房间里,里面有 3 个电灯开关,什么都不做。你可以走进去,摆弄开关,然后你必须再次走出去。你不能留下任何东西,你不能惹其他任何东西。
后来我进入同一个房间,我可以看到开关,仅此而已。
我们只能交流 8 种不同的东西,因为我可以完全列举您可能创建的每种情况:DDD、DDU、DUD、DUU、UDD、UDU、UUD 和 UUU。那是 8。
2 字节是相同的,除了它的 16 个电灯开关,而不是 3 个。因此,您可以传达 65536 种不同的状态 (2^16)。
有超过 65536 个长度为 30 左右的字符串,其中消息“此处的一些字符和 12234”很长。鉴于您必须将其“压缩”为 65536 个不同的唯一状态,因此您只能表示 65536 个不同的字符串。您可以自由选择所需的 65536 个不同的字符串,但最多只能是 65536 个字符串。毕竟,想象一下“Hi”和“Hello”都压缩到“01 191”。所以如果我看到“01 191”,你是说嗨还是说你好?这是不可能知道的。
如果您严重减少消息中可以包含的符号数量,那么让我们只减少到大写字母、空格和数字,仅此而已。没有点,没有破折号,没有下划线,没有加号,没有问号。只有 26 + 1 + 10 = 37 个字符。为了方便起见,让我们再敲掉 5 个 - 我们使“x”不可能,0 和 1(我猜只使用字母“o”和“l”)、q 和 z。现在是 32 个字符。可以用正好 5 位表示。你有 16 个 em,所以你现在可以用你的 16 位表示 3 个字母,剩下 1 位。
但仅此而已。
评论