闲来无事又翻出这本书,先前看过,其实许多部分没怎么看懂。想再看一看,但又静不下心来,翻到加法器的章节,突然在想,完全可以用 JavaScript 代码来模拟一下8位加法器的电路图。用代码以这样的方式来做加法运算,感觉挺有意思。

//取反
function _O_(a) {
    return a === 0 ? 1 : 0;
}
//与门运算
function _AND_(a, b) {
    return a && b;
}
//或门运算
function _OR_(a, b) {
    return a || b;
}
//异或门运算
function _XOR_(a, b) {
    const r1 = _OR_(a, b);
    const r2 = _O_(_AND_(a, b));
    return _AND_(r1, r2);
}
//半加器
function half_adder(a, b) {
    const s = _XOR_(a, b);
    const co = _AND_(a, b);
    return [s, co];
}
//全加器
function full_adder(ci, a, b) {
    const [s1, co1] = half_adder(a, b);
    const [s2, co2] = half_adder(ci, s1);
    const co = _OR_(co2, co1);
    return [s2, co];
}//8位二进制加法器
//a, b 为二进制字符,ci为进位标志
function adder_8(a, b, ci) {
    a = a.split("").reverse().map(n => +n);
    b = b.split("").reverse().map(n => +n);
    //duang! 8个全加器 fa1 ~ fa8
    const fa1 = full_adder;
    const fa2 = full_adder;
    const fa3 = full_adder;
    const fa4 = full_adder;
    const fa5 = full_adder;
    const fa6 = full_adder;
    const fa7 = full_adder;
    const fa8 = full_adder;
    //连接在一起
    const[s1, co1] = fa1(a[0], b[0], ci);
    const[s2, co2] = fa2(a[1], b[1], co1);
    const[s3, co3] = fa3(a[2], b[2], co2);
    const[s4, co4] = fa4(a[3], b[3], co3);
    const[s5, co5] = fa5(a[4], b[4], co4);
    const[s6, co6] = fa6(a[5], b[5], co5);
    const[s7, co7] = fa7(a[6], b[6], co6);
    const[s8, co8] = fa8(a[7], b[7], co7);
    //输出结果
    return [s8, s7, s6, s5, s4, s3, s2, s1, co8];
}
//不够8位的二进制进行补足
function f8(str) {
    let len = str.length;
    len = 8 - len;
    while (len --) {
        str = '0' + str;
    }
    return str;
}
//运算函数,a, b 为十进制小于256的整数
//ci为进位标志,1进位,0无进位
function add(a, b, ci = 0) {
    if (a > -1 && b > -1 && a < 256 && b < 256) {
        a = f8(a.toString(2));
        b = f8(b.toString(2));
        let rst = adder_8(a, b, ci);
        //最后一位是进位标志
        const co = rst.pop();
        rst = rst.join('');
        console.log(rst, parseInt(rst, 2), co);
    } else {
        console.log("必须小于256的两个正整数相加: ", a, b);
    }
}
//示例:
add(100, 25, 0);
//01111101 125 0

add(200, 100, 0);
//00101100 44 1

add(15, 15, 1);
//00011111 31 0