快速尝试。 有两个32比特的无符号整数:AHI,ALO(分裂64 UINT)
uint32 ahi, alo;
void add_to_a(uint32 b) {
if (b==0) return; // adding 0 to a number does not change it
alo = alo+b; // alo should not be less than b now, so...
if (alo<b) ahi++; // check for carry (overflow)
// if carry, increment ahi
}
唯一棘手的部分,上方,是检查是否有同时加入下部的进位。 CPU有一个内部机制来做到这一点,但在这里我诉诸另一个想法。还要注意测试“if(b == 0)return”是相当多余的,但它可以很方便。
一般来说,您可以设计其他运算符( - ,*,/),思考我们都学到了什么。如果你知道如何手工操作,你可以用C语言翻译,认为我们打破数字的长数字。我们的思想使用的是从0到9的数字,C程序可以使用8位或16位或32的数字。上面的代码片段是手动方法的直接转换以添加两个数字:我们从最后几位开始到将它们总结起来,看看这个总和是否在一个数字中。如果是的话,我们记下这个数字,然后传给下一个数字。否则,我们写下余数(“什么适合数字”)并使用进位。上面的代码片段甚至更简单,因为我们知道这两个数字分别由2位数和1位组成。
可以使分区相同(复制“手动”方法),但必须使用一些位移位。或者,如果您不介意浪费时间,只需计算您可以从另一个数字中减去一个数字的次数。 :-)
'div()'不会像那样工作。这是计算机算法中最复杂的功能。 – 0andriy
真的吗? 你的意思是不会使用我所说的Add()方法吗? –
它不会。如果您尝试在32位平台上将64位值除以32或64位值,则不会那么简单。 – 0andriy