Blog

时钟信号的硬件实现

时钟信号的硬件实现 #

在下面这张图里你可以看到,我们在原先一般只放一个开关的信号输入端,放上了两个开关。一个开关 A,一开始是断开的,由我们手工控制;另外一个开关 B,一开始是合上的,磁性线圈对准一开始就合上的开关 B。

于是,一旦我们合上开关 A,磁性线圈就会通电,产生磁性,开关 B 就会从合上变成断开。一旦这个开关断开了,电路就中断了,磁性线圈就失去了磁性。于是,开关 B 又会弹回到合上的状态。这样一来,电路接通,线圈又有了磁性。我们的电路就会来回不断地在开启、关闭这两个状态中切换。 开关 A 闭合(也就是相当于接通电路之后),开关 B 就会不停地在开和关之间切换,生成对应的时钟信号

这个不断切换的过程,对于下游电路来说,就是不断地产生新的 0 和 1 这样的信号。如果你在下游的电路上接上一个灯泡,就会发现这个灯泡在亮和暗之间不停切换。这个按照固定的周期不断在 0 和 1 之间切换的信号,就是我们的时钟信号(Clock Signal)。

一般这样产生的时钟信号,就像你在各种教科书图例中看到的一样,是一个振荡产生的 0、1 信号。 时钟信号示意图

这种电路,其实就相当于把电路的输出信号作为输入信号,再回到当前电路。这样的电路构造方式呢,我们叫作反馈电路(Feedback Circuit)。

接下来,我们还会看到更多的反馈电路。上面这个反馈电路一般可以用下面这个示意图来表示,其实就是一个输出结果接回输入的反相器(Inverter),也就是我们之前讲过的非门。 通过一个反相器实现时钟信号

Viewpoint #

From #

18 | 建立数据通路(中):指令+运算=CPU

传统学习方法与刻意练习方法的重要差别

Content #

传统学习方法与刻意练习方法的重要差别是什么?传统学习方法不会专门去挑战体内平衡,刻意练习则要求走出舒适区,做以前不可能做到的事情,迫使你的大脑或身体来适应。

Viewpoint #

From #

觉醒与掌控

Content #

心流发生在“觉醒”与“掌控”这两种状态之间,这两种状态指的是什么样的情形?

游戏网站会自动安排对弈双方,可并非随机配对。一位玩家赢的局数多,就可以升级,与水平更高的棋手对阵;反之,输得多,对手的级别也跟着下降。这种规则保证我不会碰到新手,像幼时大院里实力不强的小伙伴;也不会面对高手,像棋艺远超自己的中学生。棋艺水平与挑战程度的差距总会保持在较小的范围,我便有很多机会棋逢对手,获得频繁的心流体验。

有时升级后,对方的水平高我一点儿,这时我专心应对,思考新的攻防策略,契克森米哈赖称这种状态为“觉醒”。有时降级后,玩家的棋艺低我一筹,这时我便奋力杀敌,争取晋级后迎接更大的挑战,这种状态被称为“掌控”。心流体验就发生在这两种状态之间。

Viewpoint #

From #

心流

怎样保证useRef的初始值只被创建一次

怎样保证useRef的初始值只被创建一次? #

function Image(props) {
  const ref = useRef(null);

  // ✅ IntersectionObserver is created lazily once
  function getObserver() {
    if (ref.current === null) {
      ref.current = new IntersectionObserver(onIntersect);
    }
    return ref.current;
  }

  // When you need it, call getObserver()
  // ...
}

Viewpoint #

From #

满意原则与最优原则

Content #

决策心理学认为,人在面临选择时,通常会采用“满意原则”,而不是“最优原则”。什么是“满意原则”?什么是“最优原则”?

所谓满意原则,就是人会从自己最熟悉的待选项开始逐一进行考察,如果考察到一个满足内心标准的选项,就会采纳这个选项,余下的选项就废弃了,而并不是对比所有待选项,然后选出其中最好的。

因此,一个人会不会做出一个尽量好的选择,跟他所采纳的标准有很大的关系。如果内心的标准比较低,那么很快就会找到一个满足标准的选项,而这个选项很可能在所有选项中并不优越;如果内心的标准比较高,那么就会多比较一些选项,最后选中的那个选项就会更好。

Viewpoint #

From #

用通道来等待主goroutine

Content #

Go语言中为了让主goroutine等待其他goroutine结束,最简单粗暴的办法就是让主 goroutine“小睡”一会儿:

for i := 0; i < 10; i++ {
  go func() {
    fmt.Println(i)
  }()
}
time.Sleep(time.Millisecond * 500)

但等待的时间很难确定。更好的做法是用通道来解决,请写出该解决方案。

func main() {
        num := 10
        sign := make(chan struct{}, num)
        for i := 0; i < num; i++ {
                go func() {
                        fmt.Println(i)
                        sign <- struct{}{}
                }()
        }
        for j := 0; j < num; j++ {
                <-sign
        }
}

Viewpoint #

From #

识别对象的基本类型

Content #

JavaScript中比instanceof更加准确的识别对象对应的基本类型的方法是什么?

在 JavaScript 中,没有任何方法可以更改私有的 Class 属性,因此 Object.prototype.toString 是可以准确识别对象对应的基本类型的方法,它比 instanceof 更加准确。

var symbolObject = Object(Symbol(“a”)); console.log(Object.prototype.toString.call(symbolObject)); //[object Symbol]

Viewpoint #

From #

慷慨的针锋相对(generous tit for tat)

慷慨的针锋相对(generous tit for tat)策略指的是什么? #

诺瓦克发现,更好的办法可能是在付出和互利之间切换。

在慷慨的针锋相对(generous tit for tat)策略中,规则是“从不忘记一个好的回合,但有时要忘记一个不好的回合”。你以合作作为开始,并继续合作,直到对手表现出竞争态势。当对方竞争时,慷慨的针锋相对一般不会总是用竞争来回应,而是仅在2/3的情况下竞争,剩下1/3的情况则用合作来回应背叛。

“慷慨的针锋相对策略可以轻松战胜一般的针锋相对策略,并防止自己被叛徒利用。”诺瓦克写道。慷慨的针锋相对策略可以达到一种强大的平衡,奖励付出行为,挫败获取行为,但不会惩罚过度。它的确有风险,慷慨的针锋相对策略鼓励大多数人像付出者一样行事,但是为获取者留下了机会,让他们可以在其他人都合作的时候,凭借着竞争的做法“东山再起”。但是,在一个人际关系和声望愈加透明的世界里,获取者再想利用付出者,也越来越难了。据诺瓦克说,“慷慨的策略占据了长久的优势”。

Viewpoint #

From #

lambda expression与functional interface

Content #

Java中的functional interface指的是什么?lambda expression与functional interface之间是何种关系?

只有单个抽象方法的接口称为functional interface。lambda expression是函数,不是对象,它可以传递到声明为functional interface的位置。

Viewpoint #

From #

知识的诅咒(curse of knowledge)

Content #

对某事了解得越多,把它教授给其他人的难度就越大。为什么会这样?

当你在某些领域成为专业人士后,你的心智模型就会发展得更为复杂,而组成心智模型的步骤也会淡化成记忆背景(知识诅咒)。

批判性思维者与其他人一样,也时刻在和知识的诅咒(curse of knowledge)做斗争。所谓知识的诅咒,是指我们无法回想起我们不具备现在掌握的知识时的情况。

Viewpoint #

From #