计算机中加法实现的简单原理

1,026 阅读1分钟

链接:www.bilibili.com/video/BV1EW…

简介:计算机中加法运算其实是将十进制转成二进制进行计算,详细请看上面的视频链接介绍。

半加法器

XOR表示异或,即^,相同为0,不同为1

AND表示按位与,即&,都为1才为1,否则为0

1.png

2.png

全加法器:

3.png

4.png

实现加法的原理

5.png

代码实现:

public class Main {
    public static void main(String[] args) {
        int a = 2;
        int b = 3;
        System.out.println("用位运算计算实现加原理," + a + "+" + b + "的结果:");
        System.out.println("十进制结果:" + add(a, b));
    }
​
    /**
     * 计算a+b的结果
     */
    public static int add(int a, int b) {
        String res = binAdd(Integer.toString(a, 2), Integer.toString(b, 2));
        System.out.println("二进制结果:" + res);
        return Integer.parseInt(res, 2);
    }
​
    /**
     * 二进制加法
     *
     * @param a 二进制
     * @param b 二进制
     * @return 二进制结果
     */
    public static String binAdd(String a, String b) {
        // 获取最大的长度
        int len = Math.max(a.length(), b.length());
        // 二进制长度短的前面补0
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < Math.abs(a.length() - b.length()); i++) {
            stringBuilder.append("0");
        }
        if (a.length() >= b.length()) {
            b = stringBuilder.toString() + b;
        } else {
            a = stringBuilder.toString() + a;
        }
​
        // 取反
        a = new StringBuilder(a).reverse().toString();
        b = new StringBuilder(b).reverse().toString();
        // 半加法器
        //int carry = a & b;
        //int sum = a ^ b;
        // 存放进位
        int carry;
        // 存放位数的和
        int sum;
        // 存放进位后的值
        int num3 = 0;
        // 存放二级制结果
        StringBuilder res = new StringBuilder();
        for (int i = 0; i < len; i++) {
            int num1 = a.charAt(i) - '0';
            int num2 = b.charAt(i) - '0';
            if (i <= 0) {
                // 半加法器
                carry = num1 & num2;
                sum = num1 ^ num2;
            } else {
                // 全加法器:
                // 第一次半加法器
                carry = num1 & num2;
                sum = num1 ^ num2;
                // 第二次半加法器
                carry = carry | (sum & num3);
                sum = sum ^ num3;
            }
            // 存放位数上的值
            res.append(sum);
            // 存放进位结果
            num3 = carry;
        }
        if (num3 > 0) {
            // 说明还有进位
            res.append(num3);
        }
        return res.reverse().toString();
    }
}
​