/images/avatar.jpeg
写过点代码读过点书

使用与门、或门、非门实现加法器和减法器

笔者的程序员生涯开始于一本书:《编码:隐匿在计算机软硬件背后的语言》; 依旧清晰记得大二暑假那年读完这本书后激动的心情和颤抖的手;在随后的大学生涯中,笔者开始接触编程,旁听计算机系同学的课,系统地自学 Java,最终在大四的时候顺利找到一份编程实习工作,踏上了程序员这条路。 如今温故知新,笔者准备用这篇文章,结合代码,引用书中从零实现一个加法器和减法器的例子,带领大家领略计算机的魅力以及这本书的精彩。 本文的目标是从电路开始讲起,基于电路知识实现每个编程语言中都存在的 与 &&、或 ||、非 ! 这三个逻辑门,再基于这三个逻辑门来实现一个二进制加法器和减法器; 本文会用 JavaScript 来模拟从逻辑门到加法器和减法器的过程,让我们现在开始吧! 前置知识 电路知识 手电筒 手电筒大家都用过,上面的电路也非常简单,当导线连接在一起时,灯泡会亮;导线断开时,灯泡会熄灭; 电流 & 电池 上面的灯泡会什么会亮?那是因为导线连接在一起时,会产生电流,电流经过灯泡时遇到电阻就会发光; 形象一点解释:可以把电流理解为管道里的水,把电池理解为抽水机,把灯泡理解为水力风车; 地线 地球本身就是个大导体。 拿水流举例,地就表示大海;接地表示抽水机可以从大海里抽无穷的水,也可以排无穷的水。 表示符号 手电筒电路图简化 电磁感应 当直流电通过导体时会产生磁场,而通过作成螺线管的导体时则会产生类似棒状磁铁的磁场。 继电器 继电器用到了电磁感应原理;观察下图,当螺线管的导体通电后,会产生磁场,然后会吸引上方的开关向下,连通上方导线使小灯泡发光。 逻辑门知识 有了上面的电路知识,现在可以基于电路做作出各种逻辑门 与门 只有当两个继电器都被触发的时候灯泡才会亮。这样两个继电器的串联被称为一个与门 简化符号如下: 与门的输入与输出之间的关系同样可用下表来描述: 用 JS 可以表示如下: 1 2 3 const AND = (a, b) => { return a && b; }; 或门 两个继电器任意一个被触发的时候灯泡就会亮。这样两个继电器的并联被称为一个或门 简化符号如下: 或门的输入与输出之间的关系同样可用下表来描述: 用 JS 可以表示如下: 1 2 3 const OR = (a, b) => { return a || b; }; 非门 非门又称反向器;输入端有电流时,输出端没电流;输入端没电流时,输出端有电流;

你真的了解 setTimeout 么?聊聊 setTimeout 的最小延时问题(附源码细节)

在 JavaScript 中,setTimeout 是最常用函数之一,它允许开发者在指定的时间后执行一段代码。 但是需要注意的是,setTimeout 并不是 ECMAScript 标准的一部分,不过几乎每一个 JS 运行时都支持了这个函数。 HTML5 标准 中规定了 setTimeout 的具体行为。有同学可能听说过 setTimeout 的最小时延为 4ms,这是正确的,但是只正确了一部分正确。 在 HTML5 标准中,有如下规定: 4.If timeout is less than 0, then set timeout to 0. 5.If nesting level is greater than 5, and timeout is less than 4, then set timeout to 4. 也就是说:如果嵌套的层级超过了 5 层,并且 timeout 小于 4ms,则设置 timeout 为 4ms。chrome 中的 setTimeout 的行为基本和 HTML5 的标准一致。为什么说基本一致呢?因为 HTML 标准中是嵌套 >5 时设置最小延时,不过 chrome 的实现是 >=5 时设置最小延时。参考下面这个例子:

软件开发的一些原则

笔者在日常开发中,总结了一些软件开发的原则。例如:关注真正的收益而不是技术本身、做好必要的防御性编程、不要过早的关注性能问题、人月谬误,等等;在这里抛砖引玉,希望给大家一些启发;

浅尝有限状态机

场景 实现一个 Connection 连接类,它有 open、read、wirte、close 四个函数,下面是这四个函数的限制条件: read 需要在 open 后才能使用,否则抛出 Not Open 异常 wirte 需要在 open 后才能使用,否则抛出 Not Open 异常 open 不能在 open 状态下使用,否则抛出 Already Open 异常 close 不能在 close 状态下使用,否则抛出 Already Closed 异常 如何实现这个类? 方案一:在函数前置判断语句用来判断 最通常的做法是在 open、read、wirte、close 函数前部加一些状态判断条件,例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class Connection { state = "CLOSED"; read = () => { if (this.

node 的 crypto 模块

crypto 模块是对 OpenSSL 的封装,主要功能有 哈希、对称加密以及非对称加密。`hash` 通常给数据签名,它是不可逆的。 hash 算法有很多种,取决于当前机器 OpenSSL 的版本。

实现一个简单的 MobX

Mobx 是 React 常用的状态管理库。但是初次读 Mobx 的官方文档,概念很多,例如:`Actions`、`Derivations`、`State`,还有各种各样相关的装饰器,让人摸不着头脑。为了体现出 Mobx 的精妙,我们需要拨开层层迷雾,自己实现一个简单的 mobx