0

给定的是一个比特流(连续的比特串太长而无法一次处理),结果应该是一个匹配的 base20 数字流。

对于少量位,该过程很简单:

假设最高有效位正确:

110010011 = decimal 403 (1 * 1 + 1 * 2 + 1 * 16 + 1 * 128 + 1 * 256)
403 / 20 = 20 R 3
20 / 20 = 1 R 0
1 / 20 = 0 R 1
Result is [3, 0, 1] = 3 * 1 + 0 * 20 + 1 * 400

但是,如果位数太多而无法一步转换为十进制数怎么办?

我的方法是在一个循环中执行这两个过程:将位转换为十进制并将十进制转换为 base20 数字。此过程需要在遍历位时降低乘数(位置值),否则,它们可能会迅速增加太多而无法计算。第 64 位将乘以 2^64 等等。

4

1 回答 1

2

注意:我理解比特流在未知持续时间和未知长度内到达的问题,并且应该进行从基数 2 到基数 20 的实时转换。


我不相信这可以一次性完成。问题是基数 20 和基数 2 没有共同点,并且模运算规则不允许干净地解决问题。

(a+b) mod n = ( (a mod n) + (b mod n) ) mod n
(a*b) mod n = ( (a mod n) * (b mod n) ) mod n    
(a^m) mod n = ( (a mod n)^m ) mod n    

现在,如果您有一个以pq ( p < q ) 为底数的数字A

A = Sum[a[i] p^i, i=0->n] = Sum[b[i] q^i, i=0->n]

然后我们就知道了b[0] = A mod q。但是,我们不知道A,因此,上面告诉我们

b[0] = A mod q = Sum[a[i] p^i, i=0->n] mod q
               = Sum[ (a[i] p^i) mod q, i=0->n] mod q
               = Sum[ ( (a[i] mod q) (p^i mod q) ) mod q, i=0->n] mod q

这意味着:

如果你想知道一个以q为底的数字的最低位b 0,你需要知道全数。

仅当q = p m

b[0] = A mod q = Sum[a[i] p^i, i=0->n] mod q
               = Sum[ (a[i] p^i) mod q, i=0->n] mod q
               = Sum[ a[i] p^i, i=0->m-1]

所以简而言之,因为 q = 20 和 p = 2。我不得不说,,它不能一次完成。此外,请提醒自己,我只谈到了基数 q 中的第一个数字,而不是第 i 个数字。

例如,想象一个 1000 乘以 0 后跟单个 1 的比特流。这类似于数字 2 1000。第一个数字很容易,但要获得任何其他数字......你基本上处于一个相当困难的位置。

于 2019-03-12T16:41:55.977 回答