用于确定两个数字中哪个较大的有效代码

Efficient code to determine which of the two numbers are larger

本文关键字:代码 有效 两个 用于 数字      更新时间:2023-10-16

我有两个字符数组(每个数组的长度为多个字节;例如,每个数组可以是10-12个字节(,它们以二进制格式表示一个数字。我想检查一下一个数字是否比另一个大。检查两者中哪一个最大的最有效方法是什么?是否有可以执行的逐位操作来有效地确定这一点?

一个简单的解决方案是将它们从最高有效字节到最低有效字节进行比较:

// assuming MSB is at index 0
for(int i = 0; i < len; ++i) {
    if(a[i] > b[i]) return a;
    if(b[i] > a[i]) return b;
}
// what to return if they're equal?
return a;

这就要求它们的大小相同。您可以通过填充数组或添加额外的检查来绕过此限制。我不知道哪一个会跑得更快。

如果char的数组大小是sizeof(unsigned)的倍数,则可以将其视为unsigned的数组(或者更好的是,大小等于机器字的类型(来改进这一点,因为这将进行逐字比较。

我假设这是一个bignum数据类型。您有10-12个字符来存储80-96位的整数值。为了简单起见,我将假定无符号值。

遍历两个数组,同时比较每个数组中的元素。从最重要的元素开始。一旦你发现一个元素比另一个元素大,你就有了答案。为了获得额外的速度,通过循环展开进行机器单词大小比较。

但是,由于您是通过网络获取这些值的,bignum类成为瓶颈似乎很奇怪。网络肯定会成为你的瓶颈。更重要的是,一个好的bignum类将得到很好的优化。为什么你自己的代码会打败它?

我认为您可以首先使用两个指针指向两者中的第一个非零字节(从左起(。如果现在两个有效长度不同,则输出较长的一个。我的意思是,假设first是10个字节,second是12个字节。字节4(first[3](是first中的第一个非零字节,而字节2(second[1](则是second中的第一非零字节。现在first有效长度是7字节,而second的有效长度是11字节。显然,second更大。

现在,对于相等的有效长度。比较字节。如果相等,则转到下一个。否则,较大的字节存在于较大的数字中,我们结束。

您可以通过比较寄存器大小的块(我指的是填充整个寄存器的块(来加快此操作,因为如果两个块相等,您将跳过与寄存器大小(以字节为单位(相等的多次比较。。。如果它们不相等,你可以逐个字节进行比较,或者你甚至可以先比较一半大小。。。如果相等,则跳到另一半。如果不同,则在逐字节进行比较之前,逐个季度进行比较,依此类推(这类似于二进制搜索(。

我把它作为评论发布了,但我想我可能会把它作为答案添加进来。从最高有效字节开始,循环并进行比较,直到两个值不同。因此,在任何迭代中具有最大值的数字都是最大的数字。

如果值是有符号的,则取决于编码(例如2的补码(,第一次迭代可能是特殊情况。

编辑:您刚刚评论说数字是无符号的,因此它应该相当简单,您只需要担心第一部分。