|
|
楼主 |
发表于 2016-10-8 14:11:25
|
显示全部楼层
本帖最后由 aa77dd@163.com 于 2016-10-9 11:40 编辑
happy886rr 的二进制权值去 0 表达法
对给定整数范围 [1,63335] (16位二进制能表达的所有正整数),
如果用 16 进制表达这全部 65535 个数,
编码后不要最高位的 0, 比如: 001F 就是 31(十进制), 我们只取 1F 这两个字符,
但编码中间出现 0 仍保留, 比如: 10B 是 267(十进制), 这里中间的 0 仍保留
以此方式将 [1,63335] 范围内所有的整数全部编码, 然后把所有编码全排在一起, 总长将达到
257775 = 16/4 * (2^16 - 2^12) + 12/4 * (2^12 - 2^8) + 8/4 * (2^8 - 2^4) + 4/4*(2^4 - 2^0)
如果我们同样也只用 16 个字符来对此范围内整数编码, 但这 16 个字符全部取 2 的幂的意义:
为免混淆, 我们全部用字母:
ABCDEFGHIJKLNMOP
上面 16 个字母分别表示 2^0, 2^1, 2^2, 2^3, 2^4, ... 2^14, 2^15, 这些 2 的幂
对一个整数编码时, 我们只把这个整数的二进制形式里的所有的 1 提出, 转换成对应权值的字母, 如下:
9 转二进制 -> 1001 -> 2^3 + 2^0 -> DA
359 转二进制 -> 1 0110 0111 -> 2^8 + 2^6 + 2^5 + 2^2 + 2^1 + 2^0 -> IGFCBA
以此方式将 [1,63335] 范围内所有的整数全部编码, 然后把所有编码全排在一起, 总长将达到
65535 = 2^16 - 1 =
C[16, 1] + C[16, 2] + C[16, 3] + C[16, 4] + C[16, 5] + C[16, 6] + C[16, 7] + C[16, 8]
+ C[16, 9] + C[16, 10] + C[16, 11] + C[16, 12] + C[16, 13] + C[16, 14] + C[16, 15] + C[16, 16]
C[m, n] 是组合数, 比如 C[5, 2] = 5*4 / (2*1) = 10
65535 大概只有 257775 的 1/4, 这种编码方式比普通 16 进制编码在空间上节省很多, 关键在于权值舍 0 的方式- @echo off & setlocal enableDelayedExpansion
- >AllHexCode.txt (
- for %%a in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do ^
- for %%b in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do ^
- for %%c in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do ^
- for %%d in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
- set "HEX=##%%a%%b%%c%%d"
- set "HEX=!HEX:#0000=!"
- set "HEX=!HEX:#000=!"
- set "HEX=!HEX:#00=!"
- set "HEX=!HEX:#0=!"
- set "HEX=!HEX:#=!"
- title !HEX! / FFFF
- <nul set /p "=!HEX!"
- )
- )
- for %%a in (AllHexCode.txt) do echo;[1,63335]范围内所有整数HEX编码总长:%%~za
- pause
- exit /b
复制代码 |
|