必要なのは、0〜( 64の乱数です。問題は、これをビットパターンに変換することです。(64n)−1
これは列挙型コーディングと呼ばれ、最も古い展開された圧縮アルゴリズムの1つです。おそらく最も簡単なアルゴリズムは、Thomas Coverによるものです。これは、設定ビットが最上位ビット順でx k … x 1であるビット長の単語がある場合、これを含むすべての単語の辞書式順序におけるこの単語の位置という単純な観察に基づいています。プロパティは:nxk…x1
∑1≤i≤k(xii)
したがって、たとえば、7ビットの単語の場合:
i(0001011)=( 3
i(0000111)=(23)+(12)+(01)=0
i(0001101)=( 3i(0001011)=(33)+(12)+(01)=1
i(0001101)=(33)+(22)+(01)=2
...等々。
序数からビットパターンを取得するには、各ビットを順番にデコードするだけです。Cのような言語でのこのようなもの:
uint64_t decode(uint64_t ones, uint64_t ordinal)
{
uint64_t bits = 0;
for (uint64_t bit = 63; ones > 0; --bit)
{
uint64_t nCk = choose(bit, ones);
if (ordinal >= nCk)
{
ordinal -= nCk;
bits |= 1 << bit;
--ones;
}
}
return bits;
}
最大64の二項係数のみが必要なので、事前に計算できることに注意してください。
- カバー、T。、列挙型ソースエンコーディング。情報理論に関するIEEEトランザクション、Vol IT-19、No 1、1973年1月。