这个问题与语言无关,但我将使用C,因为这是我编码它的语言。
给定两个分别跨越n_word
个单词的整数a
和b
,比较这些多单词编号的最有效方法是什么,例如确定a < b
?(†(
作为一个具体的例子,我们可以将a
和b
视为长度为n_word
的8位整数数组,它们各自表示一个8*n_word
位整数(并假设big-endian排序(。(††(或者,该问题可以使用常规的旧十进制数字来表述,例如,a = 456
,其中a[0]
是第一个数字(4(等。
我有以下代码可以工作,但我想知道是否有可能去掉两种比较中的一种:
for (unsigned int i = 0; i < n_word; ++i) {
if (a[i] > b[i]) {
i = n_word + 1; /* use as magic number to indicate that a > b */
break;
}
else if (a[i] < b[i]) {
break;
}
}
然后由循环后i
的值确定结果:
if i < n_word, then a < b
if i > n_word, then a > b
if i == n_word, then a == b
但我实际上并不想/需要区分这三种情况;把其中两个案子合并成一个完全没问题。然而,如果我只是删除(例如(>
比较而不更改任何其他内容,则(在十进制示例中(a = 200
和b = 123
(其中a > b
(将评估为与a = 100
和b = 123
(其中a < b
(相同,这显然是不正确的。在循环中用<=
替换<
似乎同样是伪造的。
†尽管a > b
或它们的任何一种转化也可以接受。
††不,当然我并不是实际上试图比较两个32位整数,而是更像10个32位的整数,它们形成了一个非常长的整数,超出了任何原生类型的范围。
您的担忧(存在多个比较(似乎是没有根据的。
ASM
指令CMP
设置FLAG寄存器,并且两个条件跳跃都基于这些标志来执行。
请参阅https://godbolt.org/z/rfxP185Mf