C++ 用于确定两个数字中哪个更大的高效代码

C++ 用于确定两个数字中哪个更大的高效代码,c++,performance,C++,Performance,我有两个字符数组(每个数组的长度为许多字节;例如,每个可以是10-12字节),它们以二进制格式表示一个数字。我想检查一个数字是否比另一个大。最有效的方法是什么来检查哪一个是最大的?有没有按位操作可以有效地确定这一点?我假设这是一种bignum数据类型。您有10-12个字符来存储80-96位整数值。为了简单起见,我将假设无符号值 迭代两个数组,同时比较每个数组中的元素。从最重要的元素开始。一旦你发现一个元素比另一个元素大,你就有了答案。为了提高速度,请通过循环展开进行机器字大小比较 但是,由于您是

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

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

迭代两个数组,同时比较每个数组中的元素。从最重要的元素开始。一旦你发现一个元素比另一个元素大,你就有了答案。为了提高速度,请通过循环展开进行机器字大小比较


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

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

// 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;
//假设MSB位于索引0处
对于(int i=0;ib[i])返回a;
如果(b[i]>a[i])返回b;
}
//如果它们相等,返回什么?
返回a;
这要求它们的大小相同。您可以通过填充数组或添加额外检查来克服此限制。我不知道哪一个跑得更快


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

我将此作为注释发布,但认为可以添加它作为答案。从最高有效字节开始,循环并比较,直到两个值不同。因此,在任何迭代中具有最大值的数字都是最大的数字

如果值是有符号的,则根据编码(例如2的补码),第一次迭代可能必须是特殊情况


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

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

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


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

字节的布局如何?难道你不能不断地比较最重要的字节/位直到它们不同吗?你尝试了什么?您确定您的软件的特定部分存在性能问题吗??(我猜大多数解决方法都足够快)你是说像10101010100001010这样的字符数组吗?给出一个详细的例子是的,这些是使用内存块存储的无符号整数。(我使用字符数组来简化我的描述。)将它们导入gmp bignum格式,然后进行比较非常昂贵。我知道它本身并不昂贵(100纳秒),但在我的应用程序中,它将被每秒调用数百亿次。所以更有效的方法是首选。我假设字节顺序是big-endian?字宽是多少(32/64位)?这是最有效的方法吗?有没有按位技巧可以用来获得更好的性能?这并不能解释两个长度不同的数组(实际上可以相等,或者更长的数组可以表示更小的数)。不做任何假设,这家伙要求的是一个高效、实用的解决方案!对于第二次检查,请使用
else if
,而不是
if
。它更具可读性,而且是一种很好的做法。@Nawaz:我没有发现有什么显著的区别。事实上,我发现对齐的ifs更具可读性。不管怎么说,这是主观的。[@Nawaz]实际上没有区别,因为如果成功,第一个
if
将从函数返回。在所有情况下,如果我们到达第二个
if
,将进行两次比较。这取决于其他情况。在你的挂钟总时间中,有多大比例的时间用来做这个比较?当你分析的时候,你就会知道这一点。好吧,我在这一阶段的主要工作是选择数字。因此,代码大约80%的时间都花在这个比较和求和所选数字的函数中。好吧,如果你想自己做这件事,那么我看不到比我和其他人描述的更好的方法了。@danglingptr:如果数字是随机的,几乎所有的时间你都会在第一个字节得到答案,所以当你遇到“瓶颈”时,这可能不是你猜的地方。在这个循环中,你对内存分配有任何调用吗?@danglingptr:嗯,我在每种情况下都会这样做,这肯定会告诉我主要的时间成本是在I/O、导入还是其他方面。然后