1

かなり複雑なので、説明する必要があります。

私は構造体を持っています。この構造体は長い間使用され、バイナリファイルの読み取り/書き込みに使用されていました。したがって、この構造体に新しいフィールドを追加したり、フィールドを削除したりすることはできません。しかし、この構造体を作成するとき、機能で再利用するために、この構造体にスペアを入れました。さて、この構造体は次のとおりです。

struct Entry {
 int a;
 int b;
 ....
 char spare[4];
};

現在、構造体には 4 バイトあります。以下の 3 つの情報に基づいて ID エントリを作成する必要があります。

  • 時刻: (月と年、年は YY、月は MM の形式)。

  • コード: エントリのコード。3 文字が含まれます。例: ABC。

  • 値: エントリの値。float 型で、整数部と小数部に 4 つの数字が含まれます。例: 1.21、40.14 または 12.3。

上記の 3 つの情報に基づいて、4 バイトに適切に含まれる 1 つの ID エントリを作成する方法。おかげで多くの。

注:方法があります:

  • 時間: 12/99 を 12*100+99 = 1299 にエンコードするとします。

  • コード: ABC を 'A' + 'B' + 'C' = 65 + 66 + 67 = 198 にエンコードするとします。

  • 値: 40.25 を 40.14*100 = 4014 にエンコードすると仮定します。

その後、1299、198、4014 の 3 つの数字を次のようにエンコードします。

ID_Entry = (1299 * 10^7) + (198*10^4) + 4014 = 1299 198 4014 = 12.991.984.014. しかし、この ID_Entry は大きすぎて 4 バイトのスペアに収まりません

何か方法があるか、私の方法を改善してください。教えてください。助けてください。どうもありがとうございました。

P/S: ID を作成すると、同じ時間 (月 + 年) に重複することはできません。コードと値は重複しません。ts が同じでない場合、コードと値は重複する可能性があります。

4

3 に答える 3

3

データをビットフィールドにエンコードできます。

例: 月と年: 月は 0 ~ 11 であるため、4 ビットが必要です。1 年を 7 ビットとします (実際の年を取得するには、2000 のような定数を追加できます)。

それは11ビットです

3 文字コード: コードが AZ だけの場合、それぞれを 5 ビット (3*5 = 15) で実行できます。

= 26 ビットですが、id には 6 ビットしか残っていないため、必要な範囲を処理するには不十分です。

バイト内のビットは次のようになります。

MMMM_YYYY  YYYA_AAAA  BBBB_BCCC  CCII_IIII

Where M=Month, Y=Year, A=Code1, B=Code2, C=Code3, I=Id
于 2012-11-15T23:54:35.347 に答える
2

20 ポンドのジャガイモを 10 ポンドの袋に入れようとしています。

26 文字、100 年の月数、および 00.01 から 99.99 までの値を想定して、ID の可能なすべての値を考慮してください。26*26*26 * 1200 * 10000可能な値、または 210,912,000,000 の異なる組み合わせがあります。32 ビットの int には 4,294,967,296 個の異なる値しかないため、選択したエンコーディングに関係なく、すべての値を表すことはできません。

あなたができることは、それらの数のいくつかを減らすことです. 4桁じゃなくて3桁かな?たぶん、AからZではなく、AからMの文字でしょうか?年と月ではなく、月だけを記録するのでしょうか?

たとえば、値を 2 桁に制限する場合は、次のようにエンコードできます。

id = (char1 - 'A');
id = id * 26 + (char2 - 'A');
id = id * 26 + (char3 - 'A');
id = id * 26 + (year * 100 + month);
id = id * 1200 + (int)(value);

2,109,120,000通りの組み合わせ。余裕のあるビット全体以上!

于 2012-11-15T23:58:11.853 に答える
0
  1. 構造体が 4 バイトを超えています。

  2. float には 4 バイト、char には 1 バイトがあり、時間形式は 2 バイト、おそらく 1 バイトに格納できます。

衝突せずに4バイトに保存したい情報が少なくとも21バイトあることを私が理解した場合は、自分で計算してください。それ無理!

場合によっては、入力データを制限できる場合はサイズを最適化できます。たとえば、16 個の異なる文字のみが可能であるか、0 と 1 の間の浮動小数点のみが許可されますが、それでも、作成したものから達成したいことは不可能です。

于 2012-11-15T23:52:17.787 に答える