假设您要一次处理一行。(一旦你得到了每行的总质量和质心,它就是获得质心的 x 和 y 坐标的加权平均值)。
所以换句话说,你有一行位 b i并且你想要计算某些函数 f 的 b i f(i) 的总和。如果 f(i)=1,这就是位数(我们称之为 C),如果 f(i)=i,它将给出质量 M 的总矩(你将除以 C 得到质心)。
对于小于 8 位的输入,您可以轻松地存储 C 和 M 表,每个表 256 字节宽。让我们将大于 8 位的数字写为 h:l,其中 l 是数字的低 8 位,h 是其余位。
然后
C(h:l) = C(h:0) + C(0:l) = C(h) + C(l)
M(h:l) = M(h:0) + M(0:l) = M(h) + 8C(h) + M(l)
唯一棘手的位是 8C(h),对应于当我们计算 M(h) 而不是 M(h:0) 时那些 C(h) 位被向下移动 8 位。
非递归地,如果您作为字节的输入是 x0、x1、x2、x3...
C(x) = C(x0) + C(x1) + C(x2) + C(x3) + ...
M(x) = M(x0) + M(x1) + M(x2) + M(x3) + ...
+8C(x1) + 16C(x2) + 24C(x3) + ...
然后您可以通过 M 和 C 对所有行进行平均。