关卡描述
搭建一个电路,当第一路输入严格小于第二路输入时,输出1。
注意,在本关中,输入应被视作无符号整数。
过关思路
我们知道在计算机中数字都是由二进制表示的。对于8位无符号数,各个数位从高到低分别代表128,64,32,16,8,4,2,1这些十进制数。
那么当我们需要比较两个数的大小时,可以清晰地想到,通过比较每一位的大小最后把结果进行汇总。先抛开别的事实不谈,专注于两个位之间的比较:
要求前者严格小于后者。
第一位 | 第二位 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 0 |
res = (!a) * b
细节说明
这样我们就能得到第一张图:
这里我把两个八位输出用分线器分开,从上到下是从低到高的八根线。右侧的OR输出判断结果。
但是这里有个非常重要的问题:
如果我最高的一位就能出现严格小于的情况,那我剩余的其他位实际上根本不用看。
除此以外还要确保剩余7位都是的结果都是输出0的。
接下来说明最重要的一个环节:
靠上的一块称为第n层,下面的那块是第n+1层。
第n层的#1触点激活表示n+1层及以上层无法判断出两数大小,需要第n层来定夺。即#4触点与#1触点连接,方便AND门输出结果。
#2触点是两个数的同或结果,如果激活则意味着这一层无法判断出两数大小,需要第n-1层来定夺。第n层的#3触点与第n+1层的#2触点连接,表示这个数前【8-n】位都是相等的。
#1触点系列的生成逻辑:
下图为最高位(第八层)对于#1触点数据的生成方式,XNOR是同或门。
当第8位两个数相同时,第7层的#1触点激活。
理解地抽象一点就是说
我们本质上是在把一个高位数如果解决不了的问题就往低位数传递。