質問

バイトレベルで整数を扱う必要があるプロジェクトに取り組んでいます。スペースを節約することが主な考慮事項であるため、必要なのは非常に小さい(および可変長int)だけです。

int '4096'を3バイトに変換する方法はありますか?または「1053」を2バイトに変換しますか?

明らかに、手動で行うことはできます=(byte [0] * 256)+(byte [1])ですが、intをxバイトに変換して元に戻す簡単なオプションがあるかどうか疑問に思いましたか?

役に立ちましたか?

解決

できますか?はい。スペースを節約できますか?たぶん、あなたがやりたい仕事に応じて。プロセッサが32ビットであること、つまり4バイトのレジスタを持っていることを理解する必要があります。そのため、プロセッサは物を保存したりアクセスしたりします。 3バイトの「int」を強制するにはバイト配列に保持し、使用する前に配列から整列したアドレスに抽出する必要があります。つまり、短く保存すると、コンパイラはそれをパディングするか(作成したと思われる効率が失われます)、または読み取りと書き込みが lot 遅くなります。

これがデスクトップアプリの場合、特に要素ごとに1バイトを使用する場合、スペースを節約することは主にどの程度重要ですか?要素アクセスのパフォーマンスペナルティにより、1バイトがどれほど重要かについて気が変わるかもしれません。

この1バイトが本当に重要な場合、おそらく、おそらくあなたは間違った言語を使用していると主張します。そもそもCLRをインストールして使用しないことで節約できるバイト数は、これらのバイトの多くです。

サイドノート:乗算ではなく、シフトも実行します(ただし、コンパイラーはおそらくそこに到達します)。

他のヒント

追加の狂気のために、古いCスタイルのユニオントリックを使用してC#でそれを行いましょう:

[StructLayout(LayoutKind.Explicit)]
struct OddUnion
{
    /* The 32-bit integer value */
    [FieldOffset(0)]
    public int IntegerValue;

    /* The bytes that overlap with it */
    [FieldOffset(0)]
    public byte Byte1;
    [FieldOffset(1)]
    public byte Byte2;
    [FieldOffset(2)]
    public byte Byte3;
    [FieldOffset(3)]
    public byte Byte4;
 }

そして、「変換」したい場合、これを行います:

OddUnion myOddUnion;
myOddUnion.IntegerValue = 4096;
Byte secondByte = myOddUnion.Byte1;

しかし、これは本当に「保存」したい場合にのみ役立ちます。ワードからシングルバイトをビットシフトアウトするコスト。生成されたSMILを見ていないので、これが他のソリューションと比較して安価であるかどうかはわかりません。

可変長整数エンコードを行うことができます。何年も前の古い方法は、各バイトの上位ビットを使用して、整数が別のバイトに続くことを示すことでした。したがって、1バイトにつき1ビットは失われますが、小さな整数が得られます。これは、すべての最後のバイトがカウントされる永続ストレージで主に役立ちます。

例:符号なし整数を扱うと仮定すると、次のようになります

int  binary
0                       00000000
1                       00000001
...  
127                     01111111
128            00000001 10000000
129            00000001 10000001
...
255            00000001 11111111
256            00000010 10000000
...
16383          01111111 11111111
16384 00000001 10000000 10000000 

0-127で1バイト、128-16383で2バイトなど...

これを行うより複雑な方法については、このページ

をご覧ください。

BitConverter.GetBytes はバイトを取得します。

and

BitConverter.ToInt32 は、バイトから32ビット整数を取得します。

少しシフトする必要があります。すべての数字(すべての数字を意味しますが、数字は10進数、16進数のgit)は4ビットを表すため、HEXを使用するとはるかに簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top