如何将比特流转换为 base20 数字?

How to convert a bitstream to a base20 number?

给定一个比特流(连续的比特串太长,无法一次处理),结果应该是匹配的 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 等等。

注意: 我理解这个问题,即比特流到达时长度未知,持续时间未知,从 base 2 到 base 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    

现在如果你有一个数字 A 写在基数 pq (p < q) 作为

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

这意味着:

If you want to know the lowest digit b0 of a number in base q, you need to have the knowledge of the full number.

这只能简化为q = pm as

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 的比特流。这类似于数字 21000。第一个数字很容易,但要得到任何其他数字......你基本上处于一个相当困难的境地。