文章发布于:2022年8月14日
闲来无事又翻出这本书,先前看过,其实许多部分没怎么看懂。想再看一看,但又静不下心来,翻到加法器的章节,突然在想,完全可以用 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