- 論壇徽章:
- 0
|
我來說說加法吧
為了說明方便, 先考慮3個(gè)數(shù)字沒有重復(fù)的情況, 那么最簡(jiǎn)單的就是用`mode bit'方式. 這里假設(shè)<<是類似C中的left shift operator, 那么映射關(guān)系是f(n)=1<<(n-1)=2^(n-1):
- #digit->bit
- 1 -> 1<<0=1
- 2 -> 1<<1=10
- 3 -> 1<<2=100
- 4 -> 1<<3=1000
- ...
- 9 -> 1<<8
復(fù)制代碼
那么每個(gè)沒有重復(fù)數(shù)字的組合, 都可以通過bit or操作實(shí)現(xiàn)疊加, 比如:
- 235 -> 1<<1|1<<2|1<<4 = 10110
復(fù)制代碼
也就是說從右往左, 第2,3,5位是1, 其他是0
如果上面的你看明白了, 那么允許數(shù)字重復(fù)出現(xiàn)的映射也是很簡(jiǎn)單的. 以3個(gè)數(shù)字為例. 如果每個(gè)1都對(duì)應(yīng)二進(jìn)制的1, 那么三個(gè)1就對(duì)應(yīng)1+1+1=3=11(base 2), 顯然每個(gè)數(shù)字最多占用2個(gè)bit, 所以現(xiàn)在2不再對(duì)應(yīng)10, 而是100, 3個(gè)2對(duì)應(yīng)1100, 以此類推. 映射關(guān)系可以表示為 f(n)=1<<(2n-2)=2^(2n-2):
- 1 -> 1<<0=1
- 2 -> 1<<2=1,00
- 3 -> 1<<4=1,00,00
- 4 -> 1<<6=1,00,00,00
- ...
- 9 -> 1<<16
復(fù)制代碼
比如332, 就被轉(zhuǎn)化為1,00,00 + 1,00,00 + 1,00 = 11,01,00. 從右往左2bit一組, 那么第n組就代表了數(shù)字n的狀態(tài), 00, 01, 10, 11分別表示這個(gè)數(shù)字出現(xiàn)了0,1,2,3次
in general, 如果允許n個(gè)重復(fù)數(shù)字, 那么每個(gè)數(shù)字就需要b = 1+int[log_2(n)]個(gè)bit來表示, 比如n=4(100),5(101),6(110),7(111), b=3. f(n)=1<<(b*n-b)=2^(b*n-b), 而且很明顯, 同一b周期內(nèi), 這種編碼的效率在n=2^k-1, k=1,2,...時(shí)最高 (saturation), 在n=2^k時(shí)最低 |
|