我试图理解为什么双重涉猎算法有效,但我不明白。
对算法的步骤和目的有很多很好的描述,例如 http://www.classiccmp.org/cpmarchives/cpm/mirrors/cbfalconer.home.att.net/download/dubldabl.txt或 http: //en.wikipedia.org/wiki/Double_dabble
也有一些解释的尝试。我找到的最好的是这个:http: //www.minecraftforum.net/forums/minecraft-discussion/redstone-discussion-and/340153-why-does-the-double-dabble-algorithm-work#c6
但我仍然觉得我缺少连接部分。这是我得到的:
- 我明白了,您可以通过从左到右读取二进制数将它们转换为十进制数,从十进制值 0 开始,遍历二进制数的数字,每达到 1 就将十进制数加 1二进制数,并乘以 2,当您移动到下一个数字时(如最后一个链接中所述)。
- 但是为什么这会导致双涉算法呢?我们不想转换成十进制,我们想转换成 BCD。为什么我们保留乘法(移位),但我们放弃加 1?连接在哪里?
- 我明白了,当 BCD 字段中的数字在移位前超过 4 时,为什么我们必须加 3。因为如果您希望 BCD 数在移位时乘以 2,则必须进行一些修正。如果您移动 BCD 数字
0000 1000
(8) 并且想要获得双0001 0011
(16),则必须在移动前添加 3(6 的一半),因为只需移动,您最终会得到0001 0000
(10)(您错过了6)。- 但是为什么我们想要这个,加 1 发生在哪里呢?
我想我只是缺少了一小部分。