JS 加法器模拟,实现

半加器

全加器

波纹进位加法器

全部代码

补码 & 减法

常规位运算

位运算 & 简单的 assert 断言

// 常规位运算

// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

const AND = (a, b) => a & b;

const OR = (a, b) => a | b;

const XOR = (a, b) => a ^ b;

const NOT = a => ~a;

// Fake Node Assert Lib

const assert = {

deepEqual: (a, b) => {

if (a.toString() === b.toString()) return;

throw new Error(`Not Equal: ${a} ${b}`);

}

}

半加器

电路逻辑

电路简要

/**

* 半加器

* 两个 bit 输入,输出数组 [进位,和]

* 如:

* 1,1 => [1, 0]

* @param {bit} a 输入

* @param {bit} b 输入

*/

const HalfAdder = (a, b) => [a & b, a ^ b];

// 半加器测试

assert.deepEqual(HalfAdder(0, 0), [0, 0]);

assert.deepEqual(HalfAdder(0, 1), [0, 1]);

assert.deepEqual(HalfAdder(1, 0), [0, 1]);

assert.deepEqual(HalfAdder(1, 1), [1, 0]);

全加器

电路逻辑

电路简要

概要表示

概要表示

/**

* 全加器

* 两个 bit 输入,和进位输入,输出数组 [进位,和]

* 如:

* 0,1,1 => [1, 0]

* @param {bit} a 输入

* @param {bit} b 输入

* @param {bit} c 进位输入

*/

const FullAdder = (a, b, c) => {

var t1 = HalfAdder(a, b);

var t2 = HalfAdder(t1[1], c);

return [t1[0] | t2[0], t2[1]];

}

// 全加器测试

assert.deepEqual(FullAdder(0, 0, 0), [0, 0]);

assert.deepEqual(FullAdder(1, 0, 0), [0, 1]);

assert.deepEqual(FullAdder(0, 1, 0), [0, 1]);

assert.deepEqual(FullAdder(0, 0, 1), [0, 1]);

assert.deepEqual(FullAdder(1, 1, 0), [1, 0]);

assert.deepEqual(FullAdder(1, 0, 1), [1, 0]);

assert.deepEqual(FullAdder(0, 1, 1), [1, 0]);

assert.deepEqual(FullAdder(1, 1, 1), [1, 1]);

波纹进位加法器

简要图

简要图2

常见芯片表示

/**

* 波纹加法器, 4 位加法器

* 如:

* [0, 1, 0, 1],[0, 1, 0, 1] => [1, 0, 1, 0]

* @param {Array} a 4位 bit 输入数组,如:[0, 1, 0, 1]

* @param {Array} b 4位 bit 输入数组,如:[0, 1, 0, 1]

* @returns {Array}

*/

const RippleCarryAdder = (a, b) => {

let carry = 0;

let bit = 3;

let result = [];

while(bit >= 0) {

let temp = FullAdder(a[bit], b[bit], carry);

carry = temp[0];

result.push(temp[1]);

bit--;

}

return result.reverse();

}

/**

* 将数字转成 4 位二进制数组

* 如:

* 1 => [0, 0, 0, 1]

* 3 => [0, 0, 1, 1]

* @param {Number} a 数字

* @returns {Array}

*/

const to4Bit = a => (

a.toString(2)

.split('')

.reverse()

.concat(Array(4).fill('0'))

.slice(0,4)

.reverse()

.map(i => +i)

);

/**

* 将二进制字符串转为数字

* 如:

* '1010' => 10

* @param {String} a 4 位二进制字符串

* @returns {Number}

*/

const from4Bit = a => parseInt(a, 2);

/**

* 加法简写工具

* @param {Number} a 输入

* @param {Number} b 输入

*/

const helper = (a, b) => (

from4Bit(RippleCarryAdder(

to4Bit(a),

to4Bit(b)

).join(''))

)

assert.deepEqual(helper(0, 0), 0);

assert.deepEqual(helper(1, 1), 2);

assert.deepEqual(helper(1, 2), 3);

assert.deepEqual(helper(2, 2), 4);

assert.deepEqual(helper(3, 5), 8);

assert.deepEqual(helper(1, 14), 15);

// 9 + 14 为 23,但由于我们写的是 4 位加法器,所以有溢出

// 最终的结果需要 mod 0x10(也就是 16)

assert.deepEqual(helper(9, 14), 23 % 0x10);

assert.deepEqual(helper(9, 14), 7);

全部代码

关于补码 & 减法

我们以 4 bit 存储数字,并以最高位作为符号位

数字

原码

反码

补码

非溢出的十进制

2

0010

0010

0010

2

-1

1001

1110

1111

15

-3

1011

1100

1101

13

2 - 1 = 2 + (- 1) = 0010(补)+ 1111(补)= 0010(补)= 17 % 16 = 1

2 - 3 = 2 + (- 3) = 0010(补)+ 1101(补)= 1111(补)= 15 % 16 = -1

References

php条件运算符加法器,【加法笔记系列】JS 加法器模拟相关推荐

  1. 【加法笔记系列】逻辑门、半加器、全加器、波纹进位加法器

    在之前了解 PN 结以及逻辑电路实现之后,终于可以开始尝试实现计算机的加法了. 逻辑门,包括与.或.与非.异或 半加器,半加器电路 全加器,全加器电路 波纹进位加法器 逻辑门 与门 AND 或门 OR ...

  2. 【加法笔记系列】逻辑电路的实现

    了解完二极管和 PM 结原理后,就可以看懂简单的逻辑电路了 载流子 场效应管 与门 AND 二极管实现 继电器实现 CMOS 实现 NMOS 实现 或门 OR 或非 NOR 与非 NAND 载流子 在 ...

  3. vue 计算属性_lt;Vue 源码笔记系列6gt;计算属性 computed 的实现

    1. 前言 原文发布在语雀: <Vue 源码笔记系列6>计算属性 computed 的实现 · 语雀​www.yuque.com 上一章我们已经学习过 watch,这一章就来看一下计算属性 ...

  4. 两个运放制作加法器_同相加法器电路图_反相加法器电路图_运放加法器电路图解析...

    在电子学中,加法器是一种数位电路,其可进行数字的加法计算.加法器是产生数的和的装置.加数和被加数为输入,和数与进位为输出的装置为半加器.若加数.被加数与低位的进位数为输入,而和数与进位为输出则为全加器 ...

  5. vue如何让一句代码只执行一次_lt;Vue 源码笔记系列4gt;异步更新队列与$nextTick...

    1. 前言 原文发布在语雀: <Vue 源码笔记系列4>异步更新队列与$nextTick · 语雀​www.yuque.com 上一章我们讲到了修改数据是如何触发渲染函数的观察者,最终调用 ...

  6. 多语言笔记系列:Polyglot Notebooks 中使用 Html

    多语言笔记系列之:在 Polyglot Notebooks 中使用 Html 方式一:纯(传统)html方式 <!-- 主动声明单元格为 html 单元格,可以省略后在右下方选择! --> ...

  7. 行波进位加法器C语言,行波进位加法器原理

    算术运算是数字系统的基本功能,更是计算机中不可缺少的组成单元.本节介绍加法运算和减法运算的逻辑电路. 一.半加器和全加器 1.半加器 半加器和全加器是算术运算电路中的基本单元,它们是完成1位二进制数相 ...

  8. SQL Server 2008/2012中SQL应用系列及BI学习笔记系列--目录索引

    SQL Server 2008中的一些特性总结及BI学习笔记系列,欢迎与邀月交流. 3w@live.cn  ◆0.SQL应用系列 1.SQL Server 2008中SQL增强之一:Values新用途 ...

  9. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1

    <ASP.NET Core In Action>读书笔记系列五 ASP.NET Core 解决方案结构解析1 参考文章: (1)<ASP.NET Core In Action> ...

最新文章

  1. HDUOJ------Worm
  2. IAR 中打多个断点出现 one or more breakpoints coule not be set and have been disabled原因及解决方案
  3. MySQL有什么新功能?
  4. buffer string builder简单说明
  5. lq分解的matlab语言,MATLAB-语言及其应用.ppt
  6. 敏捷个人新体系学习 - 1.实践的艺术
  7. matlab和C/C++混合编程--Mex (转载)
  8. 深度学习2.0-42.Auto-Encoders-无监督学习
  9. 解决SQL数据库无法附加
  10. Mapped Statements collection already contains value for com.wen.mapper.ProjectMapper.xxx
  11. SREng日志全分析(一)
  12. windows7 照片查看器无法打开图片, windows提示因为可用内存不足,但我的内存4G?
  13. 组合最优化——期中总结
  14. 《Photoshop修饰与合成专业技法》目录—导读
  15. 企业实施PDM能解决这些问题
  16. 微信小游戏开发新手教程14-整合到一起,做出你的小游戏
  17. python交互式和文件式区别_Python 运行.py文件和交互式运行代码的区别详解
  18. 文件管理器和FTP客户端:ForkLift for Mac
  19. Java条形码生成-Barcode4j
  20. 辗转相除法——求最大公约数(易懂详解)

热门文章

  1. SQL解析利器General SQL Parser
  2. IDEA 2021.1正式发布,新增了这几个超实用功能!
  3. ArrayList(Map(k v))相关操作和遍历
  4. 数学差学计算机和编程难吗,数学很差能学计算机吗
  5. java基础环境搭建_java基础环境搭建
  6. Java lang3的 StringUtils.isNumeric(str)不能识别负数和小数
  7. LeetCode第12题 整数转罗马数字
  8. (备忘)卸载微软自带输入法
  9. 20151227感知机(perceptron)
  10. 基于MSP430F413水果电池供电的低功耗时钟