我们有 250500*250500 = 62,570,250,000。我们如何使用低位和高位来表示这个数字?我知道 32 位可以表示的最大数字是 4,294,967,295 (2^32 - 1)
答案1
用二进制表示,250500*250500 = 62,570,250,000 如下所示:
0011 1101 0010 1000 0100 * 0011 1101 0010 1000 0100 =
0110 1001 1100 0011 0100 1101 0100 0001 0000
数学的固定规则表明,您可以将 18 位数乘以 18 位数的结果放入 36 位中。数学的固定规则表明,您不一定能通过压缩减少位数,因此您可能需要处理一些限制。
不过,可能还是有一些选择的。
计算机可用于记录米...或公里。
如果您记录 50 公里的概念,这实际上与记录 50,000 米相同。
同样,您不必记录 250500*250500 = 62,570,250,000(即 250,500 个单位 x 250,500 个单位),而是可以记录十进制单位,例如 25050x25050 = 627,502,500(250,500 个十进制单位 x 250,500 个十进制单位 = 627,502,500 个平方十进制单位)。数字 627,502,500 可以容纳在 32 位字中。
熟练的计算机程序员应该考虑计算机内存代表什么(例如,如果一段内存存储了有关单位或十单位的信息),并考虑进行调整以获得好处(例如解决限制问题,或者只是以更快的速度运行)。
也许,您可能不想跟踪十单位(即 10 个单位的组),而是想要跟踪不同大小的单位组,例如 500 个单位的组。这个概念是,如果您知道您的数字始终是偶数,那么您可以将数字除以二,并可能使用较小的单位。(尽管,您需要除以 2 以上才能达到特定的最大值 4,294,967,295。)如果您可以跟踪百单位(每个 100 个单位),那么您将得到 2,505*2,505=6,275,025(12 位乘以 12 位,这可能需要 24 位来存储结果,但恰好在这种特殊情况下只需要 23 位)。如果您可以跟踪五百单位(500),则将有 501*501=251,001(9 位乘以 9 位,以 18 位存储)。
能否找到有用的模式是实用编程的一个方面,它不仅仅取决于是否熟悉编程语言。能否做到这一点通常取决于您要跟踪的现实世界概念,并且可行性(和实现细节)可能因不同的现实场景而异。
编辑:小修正。还扩展了约 500 个单位的段落,以显示实际数字作为示范。
答案2
问题当前是:“我们有 250500*250500 = 62,570,250,000。”
好吧,这完全是胡说八道。250500
*250500 = 62,570,250,000。(问题中指出了错误的数学)
250500*250500 = 62,750,250,000。(正确的数学,问题可能想问)
这打乱了我的部分计算。如果我们假设有拼写错误,并进行纠正,那么我可以给出 62,750,250,000 的答案。
这个问题的简单直接的答案是:存储一个较小的数字和一个幂。这就是答案,浓缩成几个字。这个答案可能需要一些解释,这就是我提供本文其余部分的原因。
25,500 是 18 位。2
是 1 位。
总共需要 19 位。即 32 位。这样就行了。
实际上,这种思维方式与 x86 CPU(80387 及更新版本)跟踪浮点数的方式非常相似,使用一些位作为有效数字。
问题没有指定 62,570,250,000 需要存储为直接数。可以做的第一件事是尝试对其求平方根,看看结果是否为整数。结果是一个整数,因此有一个完全有效的解决方案。此解决方案成功允许存储一些大到 549,755,748,352 的数字(等于 8,388,607 * 65,536,即 8,388,607 *(2 的 16 次方))。该系统可以准确表示的数字之一是
62,750,250,500
,尽管该系统无法存储
62,750,250,499
不过,这没关系,因为这个问题不需要存储所有可能的较小数字。这个问题只是想要找到一种表示数字 62,750,250,500 的方法。这是完全可行的。
因此,您存储的位是:
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0
使用类似于通用 IEEE 浮点汇编的技术,这些位可以被解释为:
- 正数(第一位)
- 25500(第 10 至 32 位)
-
它自己乘以一次
- 因为...“1”是第 2 到第 9 位的值。
请注意,第 2 至第 8 位和第 10 至第 14 位是前导零。在这种情况下,7+5=12 位不是非常有效。如果假设为正数,则对于这种特定情况,13 位可能有点无效/低效,因此这些位可能会以不同的方式使用。(记得我之前说过我们需要 32 位中的 19 位。13+19=32。)
这里的想法是,当你知道这个数字可以很容易地表示为 2 的幂时,就没有必要将“输出”存储为一个大数字。62,750,250,000 这个值被有效地存储了,并且它的表示方式是存储一个较小的数字以及幂。本质上,我们存储的数据如果与我们指定的已知公式相结合,就可以存储这个特定的数字。(在人们经常处理平方数的情况下,这个公式可能最终对存储其他数字有用。)
注意:该系统与 IEEE 浮点系统有些相似,但并不完全相同,我曾在大学汇编课程中看到过对该系统的讨论,该课程侧重于 x86 汇编。以下是超链接IEEE 浮点数在线转换器您可以将其用于该系统。在该系统中,指数的位指定使用 2 的哪个幂来乘以剩余的位。但是,这并不适合这种情况,因为 25,500 不是 2 的幂。尝试使用 IEEE 的浮点系统,我们可以发现 62,750,250,000 除以 16 等于 3,921,890,625。所以我们可以将数字表示为 3,921,890,625 倍(2 的四次方)。不过,我们需要 36 位,这比要求的 32 位要大(并且比英特尔的协处理器用于存储数字的非指数版本的 24 位要大)。
我可能在很大程度上忽略了问题中的“使用低位和高位”部分。我不太清楚这个问题到底在问什么。然而,这个系统确实将不同的位用于不同的目的,因此数据的指数部分可以被视为比放置在较低位置的其他位“更高”的位。因此,粗体句子直接回答了“我们如何表示这一点”这个问题,并在本答案的其余部分中进一步解释。