您找到的代码试图解释非常原始的计算机硬件如何实现“添加”指令。我说“可能”是因为我可以保证任何人都不会使用此方法CPU,因此我将解释原因。
在正常生活中,您使用十进制数字,并且学习了如何将它们相加:要添加两个数字,请添加最低的两位数字。如果结果小于10,则记下结果并继续到下一个数字位置。如果结果是10或更大,则记下结果减去10,继续到下一位,买时请记住再加上1。例如:23 + 37,您加3 + 7 = 10,写下0,并记住为下一个位置再加1。在10s位置,您将(2 + 3)+ 1 = 6记下来。结果是60。
您可以使用二进制数执行完全相同的操作。不同之处在于,唯一的数字是0和1,因此,唯一可能的总和是0、1、2。对于32位数字,您将要处理一个数字的位置。这就是真正的原始计算机硬件将如何做。
此代码的工作方式不同。您知道如果两个数字均为1,则两个二进制数字的总和为2。因此,如果两个数字均为1,则您将在下一个二进制位置再加上1,并记下0。这就是t的计算结果:它找到所有位置其中两个二进制数字均为1(即&),并将它们移至下一个数字位置(<< 1)。然后,它执行加法运算:0 + 0 = 0,0 + 1 = 1,1 + 0 = 1,1 + 1是2,但是我们写下了0。这就是排他或运算符的作用。
但是尚未处理下一位数字中必须处理的所有1。它们仍然需要添加。这就是代码执行循环的原因:在下一次迭代中,将添加所有额外的1。
为什么没有处理器那样做?因为这是一个循环,并且处理器不喜欢循环,所以速度很慢。它很慢,因为在最坏的情况下,需要32次迭代:如果将数字0xffffffff加1(32个1位),则第一次迭代将y的位0清零并将x设置为2。第二次迭代将清零bit 1。 y并将x设置为4。依此类推。它需要32次迭代才能得到结果。但是,每次迭代都必须处理x和y的所有位,这需要大量硬件。
从最低位置到最高位置,原始处理器将以与十进制算术一样快的速度执行操作。它也需要32个步骤,但是每个步骤仅处理两位加上前一位位置的一个值,因此实现起来容易得多。即使在原始计算机中,也可以负担得起而不必实现循环。
现代,快速且复杂的CPU将使用“条件和加法器”。特别是如果位数很高,例如64位加法器,则可以节省大量时间。
64位加法器由两部分组成:首先,是最低32位的32位加法器。该32位加法器产生一个和,以及一个“进位”(指示必须在下一个位位置加1)。其次,两个32位加法器用于较高的32位:一个加x + y,另一个加x + y +1。所有三个加法器并行工作。然后,当第一个加法器产生进位后,CPU会选择两个结果x + y或x + y +1中的哪个是正确的,您便得到了完整的结果。因此,64位加法器仅比32位加法器花费一点时间,而不是两倍。
32位加法器部分再次使用多个16位加法器实现为条件和加法器,而16位加法器则是条件和加法器,依此类推。
add
机指令,我猜这是所有CPU都具备的,并实现为可以在几个时钟内工作的硬件加法器。