除二倒序取余的数学原理
在本科低年级,除二倒序取余数是我们学习过的一种十进制数字向二进制数字转换的方法。但是当时不求甚解,没有从数学原理的角度去分析这个问题,因此一直觉得对这个方法的理解不足。之前在知乎看到一个帖子,深受启发,在此转述一下原理的叙述。
对于一个十进制数,我们的表示为
a n 1 0 n + a n − 1 1 0 n − 1 + . . . + a 1 1 0 1 + a 0 1 0 0 a_{n}10^n + a_{n-1}10^{n-1} + ... + a_{1}10^{1} + a_{0}10^0 an10n+an−110n−1+...+a1101+a0100
比如数字567可以写为
5 ∗ 1 0 2 + 6 ∗ 1 0 1 + 7 ∗ 1 0 0 5 * 10^2 + 6 * 10^1 + 7 * 10^0 5∗102+6∗101+7∗100
同样,二进制表示中,一个二进制数有类似的表达方式。
a n ∗ 2 n + a n − 1 ∗ 2 n − 1 + . . . + a 0 ∗ 2 0 a_{n} * 2^n + a_{n-1} * 2 ^ {n-1} + ... + a_{0} * 2^{0} an∗2n+an−1∗2n−1+...+a0∗20
例如567可以写成
( 1000110111 ) 2 (1000110111)_{2} (1000110111)2即
1 ∗ 2 9 + 1 ∗ 2 5 + 1 ∗ 2 4 + 1 ∗ 2 2 + 1 ∗ 2 1 + 1 ∗ 2 0 1*2^9 + 1 * 2^5 + 1 * 2^4 + 1 * 2^2 + 1 * 2^1 + 1*2^0 1∗29+1∗25+1∗24+1∗22+1∗21+1∗20
对于10进制数,除10以后,余数是10位表示中,个位的数字。表示如下
a n 1 0 n + a n − 1 1 0 n − 1 + . . . + a 0 1 0 0 = 10 ∗ ( a n 1 0 n − 1 + a n − 1 1 0 n − 2 + . . . + a 1 ) + a 0 a_{n}10^{n} + a_{n-1}10^{n-1} + ... + a_{0}10^0 = 10 * (a_{n}10^n-1 + a_{n-1}10^{n-2} + ... + a_{1}) + a_{0} an10n+an−110n−1+...+a0100=10∗(an10n−1+an−110n−2+...+a1)+a0
这个被孤零零留下的余数 a 0 a_{0} a0即位10进制的最低位。
以此类推,
Z = a n 1 0 n + a n − 1 1 0 n − 1 + . . . + a 0 1 0 0 = 10 ∗ ( a n 1 0 n − 1 + a n − 1 1 0 n − 2 + . . . + a 1 ) + a 0 = 10 ∗ [ 10 ∗ ( a n 1 0 n − 2 + a n − 1 1 0 n − 3 + . . . + a 2 ) + a 1 ] + a 0 Z = a_{n}10^{n} + a_{n-1}10^{n-1} + ... + a_{0}10^0 = 10 * (a_{n}10^n-1 + a_{n-1}10^{n-2} + ... + a_{1}) + a_{0} = 10 * [10 * (a_{n}10^{n-2} + a_{n-1}10^{n-3} + ... + a_2) + a_{1}] + a_0 Z=an10n+an−110n−1+...+a0100=10∗(an10n−1+an−110n−2+...+a1)+a0=10∗[10∗(an10n−2+an−110n−3+...+a2)+a1]+a0
对于一个二进制数也相同。
将一个二进制数不断除以2取余数,依次得到整数在二进制下的个位,十位…
Z = a n 2 n + a n − 1 2 n − 1 + . . . + a 0 2 0 = 2 ∗ ( a n 2 n − 1 + a n − 1 2 n − 2 + . . . + a 1 ) + a 0 = 2 ∗ [ 2 ∗ ( a n 2 n − 2 + a n − 1 2 n − 3 + . . . + a 2 ) + a 1 ] + a 0 a_{n}2^n + a_{n-1}2^{n-1} + ... + a_{0}2^0 = 2 * (a_{n}2^{n-1} +a_{n-1}2^{n-2} + ... + a_1) + a_{0} = 2 * [2 * (a_n2^{n-2} +a_{n-1}2^{n-3} + ... + a_{2}) + a_{1}] + a_{0} an2n+an−12n−1+...+a020=2∗(an2n−1+an−12n−2+...+a1)+a0=2∗[2∗(an2n−2+an−12n−3+...+a2)+a1]+a0
567这个数,无论是 ( 567 ) 10 (567)_{10} (567)10还是 ( 1000110111 ) 2 (1000110111)_{2} (1000110111)2本质都是同一个数的不同表示。
reference: https://www.zhihu.com/question/343550977