在数学上,如果你有一个有限集(X,大小为 n(na 正整数)和一个比较运算符(X 中的 x,y,z;x<=y 和 y<=z 意味着 x<=z),它是找到最大值的非常简单的问题。(同样,它存在。)
解决这个问题的最简单方法,但计算量最大,是生成一个包含所有可能值的数组,然后找到最大值。
第 1 部分。对于具有有限成员集的任何类型,都有有限数量的位 (m) 可用于唯一地表示该类型的任何给定成员。我们只是创建一个包含所有可能的位模式的数组,其中任何给定的位模式都由特定类型中的给定值表示。
第 2 部分。接下来我们需要将每个二进制数转换为给定的类型。这个任务是我缺乏编程经验的地方,让我无法谈论如何完成这个任务。我读过一些关于铸造的文章,也许这会奏效?或者其他一些转换方法?
第 3 部分。假设上一步已完成,我们现在拥有所需类型的有限值集和该集上的比较运算符。找到最大值。
但如果...
...我们不知道给定类型的成员的确切数量?比我们高估了。如果我们不能产生合理的高估,那么这个数字应该有物理界限。一旦我们有一个高估,我们检查所有这些可能的位模式,以确认哪些位模式代表该类型的成员。在丢弃那些未使用的之后,我们现在有一组所有可能的位模式,它们代表给定类型的某些成员。这个最近生成的集合是我们现在在第 1 部分中使用的。
...我们没有那种类型的比较运算符?比具体问题不仅不可能,而且在逻辑上不相干。也就是说,如果我们的程序无法获得有意义的结果,如果我们比较来自给定类型的两个值,那么我们给定的类型在我们的程序上下文中没有排序。没有排序,就没有最大值。
...我们不能将给定的二进制数转换为给定的类型?然后方法中断。但与前面的例外类似,如果您不能转换类型,那么我们的工具集在逻辑上似乎非常有限。
从技术上讲,您可能不需要在二进制表示和给定类型之间进行转换。转换的重点是确保生成的列表是详尽的。
...我们想优化问题?比我们需要一些关于给定类型如何从二进制数映射的信息。例如,无符号整数、有符号整数(2 的补语)和有符号整数(1 的补语)每个都以非常有文档且简单的方式从位映射到数字。因此,如果我们想要 unsigned int 的最大可能值并且我们知道我们正在使用 m 位,那么我们可以简单地用 1 填充每个位,将位模式转换为十进制,然后输出数字。
这与优化有关,因为该解决方案最昂贵的部分是列出所有可能的答案。如果我们对给定类型如何从位模式映射有一些先前的知识,我们可以通过生成所有潜在候选来生成所有可能性的子集。
祝你好运。