我有一个神秘的错误,是用一种算法来减去各种长度的无符号整数。它几乎适用于每一对数字,但如果n不小于单元格中的位数,则(2^n +1)-(2^n - 1) <> 2
。我不明白为什么算法不起作用。
这些数字存储在“cellimal”系统的数组中(基数=2^位),最低有效的单元格存储在lowmem中。AD1处的数组将从AD2处的数组中减去,两个数组的长度相同,结果应存储在AD2处:
false borrow ! len 0
do i ad2 + @ borrow @ +
i ad1 + @ 2dup u< dup borrow !
if 1 swap 0 d- drop \ subtraction with borrow
else - \ subtraction without borrow
then i ad2 + ! cell
+loop
注意:我认为错误来自于从包含零值的单元格中借用…
也许有人能修正算法?
最佳答案
是的,我们还应该在借钱的时候留着提货标志。
简单的解决方案是在任何地方都使用D-
:
0 borrow !
len 0 DO
ad2 I + @ 0
borrow @ 0 D-
ad1 I + @ 0 D-
ABS borrow !
ad2 I + !
cell +LOOP
或者一些变化(循环体):
borrow @ S>D
ad2 I + @ 0 D+
ad1 I + @ 0 D-
borrow !
ad2 I + !
或许,正确的方法是使用
M+
operation的概念。