我有两个字符数组(每个字节长度很多;例如每个可以是10-12个字节),它们代表二进制格式的数字。我想检查一个数字是否大于另一个数字。检查两者中哪一个最大的最有效方法是什么?是否有可以执行的按位操作来有效地确定这个?
答案 0 :(得分:2)
我假设这是一种bignum数据类型。你有10-12个字符来存储80-96位整数值。为简单起见,我将假设无符号值。
迭代两个数组同时比较每个数组的元素。从最重要的元素开始。一旦你发现一个元素比另一个元素大,你就得到了答案。为了提高速度,请通过循环展开来比较机器字大小。
但是既然你通过网络获得了这些价值,那么bignum类是一个瓶颈似乎很奇怪。当然,网络将成为你的瓶颈。更重要的是,一个好的bignum类将得到很好的优化。为什么你自己的代码会击败它?
答案 1 :(得分:2)
一个简单的解决方案是将它们从最重要的字节到最不重要的字节进行比较:
// 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
的数组大小是{{1}的倍数,则可以将unsigned
的数组视为sizeof(unsigned)
的数组(或更好,大小等于机器字的类型) },因为这将按字面进行比较。
答案 2 :(得分:1)
我认为你可以做的是首先使用两个指针来指向两者中的第一个非零字节(从左侧开始)。如果现在两个有效长度不同,则输出较长的有效长度。我的意思是,我们假设first
是10个字节而second
是12个字节。字节4(first[3]
)是first
中的第一个非零字节,字节2(second[1]
)是second
中的第一个非零字节。现在first
的有效长度为7个字节,而second
的有效长度为11.显然,second
更大。
现在等于有效长度。比较字节。如果相等,请转到下一个。否则,较大的字节存在于较大的数字中,我们就完成了。
你可以通过比较寄存器大小的块(我的意思是填充整个寄存器的块)来加快这个操作,因为如果两个块相等,你将跳过一些等于寄存器大小的比较,以字节为单位。 ..如果它们不相等,你可以逐字节比较,或者你甚至可以先将半尺寸比较半尺寸......如果相等,则跳到另一半。如果不同,则比较四分之一大小的四分之一大小,依此类推,然后逐字节比较(这类似于二进制搜索)。
答案 3 :(得分:0)
我将此作为评论发布,但我想我可能会将其添加为答案。从最重要的字节开始,循环并比较直到两个值不同。因此,在任何迭代中具有最大值的数字是最大的数字。
如果值是有符号的,取决于编码(例如2的补码),第一次迭代可能必须是特殊情况。
编辑:您刚评论这些数字是未签名的,因此它应该相当简单,您只需要担心第一部分。