用于确定两个数字中哪个较大的有效代码
Efficient code to determine which of the two numbers are larger
我有两个字符数组(每个数组的长度为多个字节;例如,每个数组可以是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的补码(,第一次迭代可能是特殊情况。
编辑:您刚刚评论说数字是无符号的,因此它应该相当简单,您只需要担心第一部分。
- GCC对可能有效的代码抛出init list生存期警告
- 这是什么代码?为什么它有效?C++
- 为什么此代码片段有效?如何取消引用空点?
- 使用C++字谜代码仅在有时有效
- 为什么以下代码在在线 ide(gcc 7.2.0) 上有效,但在 ubuntu 上出现错误?
- 为什么第二个代码有效而第一个代码无效?
- 为什么认为参考文献在C 底漆第5个中没有变化,以下代码有效
- 我的代码有效,但 setter 不会创建新对象,所以我得到错误的结果
- 为什么这段代码有效?我的意思是会员是私人的
- 为什么这段代码有效,而那段代码不起作用?
- 学习左值和右值,但不确定为什么这个代码有效
- 为什么Bjarne "Tour of C++"中的这段代码有效?
- C++ 装饰设计模式 - 代码有效但不知道为什么
- 代码有效 数学不行
- C++程序.为什么这段代码有效
- 此代码有效吗?适用于 gcc,不要与 clang 合作
- 内联命名空间变量有内部链接吗?如果没有,为什么下面的代码有效
- 此 C++ 模板代码有效吗?G++编译它,但Clang不会
- 为什么我的代码有效?简单的算术
- 持久性测试:为什么以下代码有效