计算机内部如何添加两个数字?

时间:2016-07-02 17:32:21

标签: java c algorithm computer-science

我相信计算机必须借助于带有按位左移操作符的异或来实现它。对吗?

这是java

中的实现
public class TestAddWithoutPlus {

    public static void main(String[] args) {
        int result = addNumberWithoutPlus(6, 5);
        System.out.println("result is " + result);

    }

    public static int addNumberWithoutPlus(int a, int b) {
        if (a == 0) {
            return b;
        } else if (b == 0) {
            return a;
        }
        int result = 0;
        int carry = 0;

        while (b != 0) {

            result = a^b; // SUM of two bits is A XOR B
            carry = (a&b); // CARRY is AND of two bits

            carry = carry << 1; // shifts carry to 1 bit to calculate sum
            a=result;
            b=carry;

        }
        return result;
    }

}

1 个答案:

答案 0 :(得分:2)

我将回答一个典型的位并行处理器,如个人计算机,微控制器等所示。这不适用于bit-serial architecture,这在某些类型的特殊情况下更常见DSP和某些FPGA设计。

通常情况并非如此,因为对于窄宽度(如32或64位),adder circuit比显示的串行加法更有效,因为它可以异步完成添加,而不是多个时钟周期。

然而,基本纹波进位加法器的原理是相同的 - 最低有效位的加法器计算结果的一位和进位位,进位到对应于下一位的全加器作为进位等,如图所示:

Ripple-carry adder comprised of full adders

来源:Wikimedia Commons,用户cburnett,在Creative Commons 3.0 Share-like

然而,实际上,来自LSB加法器的进位可能需要一直传播到MSB加法器这一事实对性能造成了限制(由于传播延迟),因此可以使用各种先行方案。 p>