用JS自制表格软件玩数据11. 虚拟机电路仿真加法运算器
Posted 妇男主任
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用JS自制表格软件玩数据11. 虚拟机电路仿真加法运算器相关的知识,希望对你有一定的参考价值。
虚拟机
简述
原本只是打算仿真一下计算机的架构即可,但是最近思考了一下整体的架构,既然浏览器的V8性能也不差,干脆就一撸到底吧。直接从数字电路仿真搞起来。该系列的文章写得确实比较毛糙,我这边会陆续整理好代码,再慢慢整理完善这些文章。
这个加法机只能工作于二进制数,假设如下运算:
1+1 = 1
001 + 001 = 010
看下面的运算表
001
+001
-----
010
加法计算对照表
+ | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 10 |
布尔运算器的实现
第一步:与门运算
与 | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
用JS代码表示
function _and(a,b)
return a && b;
第二步:或门运算
或 | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
用JS代码表示
function _or(a,b)
return a || b;
第三步:非门运算
非 | 0 | 1 |
---|---|---|
取反 | 1 | 0 |
用JS代码表示
function _non(a)
return !a&1;
//如果a 为 0 , 首先会运行 !a 得到 true,接着就变成 true&1,true&1 的运行结果就会变成 1.
//如果a 为 1 , 首先会运行 !a 得到 false,接着就变成 false&1,false&1 的运行结果就会变成 1.
第四步:或非运算
或非 | 0 | 1 |
---|---|---|
0 | 1 | 0 |
1 | 0 | 0 |
用JS代码表示
function _nor(a,b)
return !(a||b)&1;
第五步:与非运算
与非 | 0 | 1 |
---|---|---|
0 | 1 | 1 |
1 | 1 | 0 |
用JS代码表示
function _nand(a,b)
return !(a && b)&1;
第六步:半加器运算
进位 | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
求和 | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
用JS代码表示
function _HalfAdder(a,b)
let _or = a || b;
let _nand = !(a && b)&1;
return [
a && b, // 进位
_or && _nand] // 和
第七步:全加器的实现
全加器由半加器组合而成,所以全加器的代码实现需要调用半加器封装好的模块。同时,为了使用更加方便,我直接把代码全部封装在类里面,最后面会贴上全部代码以供参考。
用JS代码表示
/**
* 全加器
* @param * a 加数a
* @param * b 加数b
* @param * cin 进位输入
* @returns 返回进位结果与加法的和
*/
_FullAdder(a,b,cin)
let out1 = _HalfAdder(a,b);
let out2 = _HalfAdder(cin,out1[1]);
return [
out1[0] || out2[0],
out2[1]
]
第八步:8位二进制加法器的实现
8位二进制成为一个BIT。所以我们把加法器的最基本实现以1个BIT为基础。它由8个全加器串联而成。
用JS代码表示
/**
* 8位串行加法器
* @param * a 加数a (以数组的形式传入)
* @param * b 加数b (以数组的形式传入)
* @returns 返回运算是否溢出与加法的和
*/
_BitAdder(a,b)
let result = [0,0,0,0,0,0,0]
let carry = 0;
let t;
for (let index = 7; index > -1; index--)
t = this._FullAdder(a[index],b[index],carry) // 全加器
carry = t[0];
result[index] = t[1];
// carry如果为1,则溢出
return [carry,result]
运行测试
全代码
贴上全代码,下一章会分享减法器的实现。
/**
* 逻辑门组件
*/
class boolgate
constructor()
/**
* 与逻辑门
* @param * a
* @param * b
* @returns
*/
_and(a,b)
return a && b;
/**
* 或逻辑门
* @param * a
* @param * b
* @returns
*/
_or(a,b)
return a || b;
/**
* 非逻辑门
* @param * a
* @returns
*/
_non(a)
return !a&1;
/**
* 或非逻辑门
* @param * a
* @param * b
* @returns
*/
_nor(a,b)
return !(a||b)&1;
/**
* 与非逻辑门
* @param * a
* @param * b
* @returns
*/
_nand(a,b)
return !(a && b)&1;
/**
* 半加器
* @param * a
* @param * b
* @returns
*/
_HalfAdder(a,b)
let _or = a || b;
let _nand = !(a && b)&1;
return [
a && b, // 进位
_or && _nand] // 和
/**
* 全加器
* @param * a
* @param * b
* @param * cin
*/
_FullAdder(a,b,cin)
let out1 = this._HalfAdder(a,b);
let out2 = this._HalfAdder(cin,out1[1]);
return [
out1[0] || out2[0],
out2[1]
]
/**
* 8位串行加法器
* @param * a
* @param * b
* @returns
*/
_BitAdder(a,b)
let result = [0,0,0,0,0,0,0]
let carry = 0;
let t;
for (let index = 7; index > -1; index--)
t = this._FullAdder(a[index],b[index],carry) // 全加器
carry = t[0];
result[index] = t[1];
// carry如果为1,则溢出
return [carry,result]
以上是关于用JS自制表格软件玩数据11. 虚拟机电路仿真加法运算器的主要内容,如果未能解决你的问题,请参考以下文章