0

C# のヘルプが必要です
.C# でモジュールを開発する必要があります。このモジュールは CPU と RAM を大量に消費します。すべてのビットがカウントされます!!
構造体を保持するリストを作成するとします。フィールドの 1 つはカスタマイズされた整数になります。
整数は 0,1,2 (2 進数: 00,01,10) しか指定できないので、2 ビットより大きい整数は必要ありません。
これは、最小の組み込み整数 (8 ビットのバイト) よりも適しています。
通常の整数として機能するには新しい整数が必要なので、単純な値の割り当てや単純な算術計算をしようとするときに、キャスト (非常に高価) やその他の特別な操作を使用する必要はありません..
方法はありますか?メインプログラムの残りのコードを変更せずに、構造体内でカスタム整数を定義するにはどうすればよいですか?
短い構造体を書いていただくか、同様の実装を紹介していただければ幸いです。どうも
ありがとうござい ました。

4

1 に答える 1

5

「ushort、それは 4 ビットです」

いいえ、ushort は 16 ビットです。1 バイトは最小で、8 ビットです。

「メイン プログラムの残りのコードを変更せずに、構造体内でカスタム整数を定義する方法はありますか?」

いいえ、1 バイトより小さい構造体を作成することはできないため、2 ビットのみを使用する整数を作成するには、複数の値を 1 バイトに格納できるように、それらを保持するコレクションを変更する必要があります。

何かのようなもの:

public class TwoBitArray {

  private int _len;
  private byte[] _data;

  public TwoBitArray(int size) {
    _len = size;
    _data = new byte[(size + 3) / 4];
  }

  public int this[int index] {
    get {
      if (index < 0 || index >= _len) throw new IndexOutOfRangeException();
      int ofs = index / 4;
      int shift = (index & 3) * 2;
      return (_data[ofs] >> shift) & 3;
    }
    set {
      if (index < 0 || index >= _len) throw new IndexOutOfRangeException();
      if (value < 0 || value > 3) throw new ArgumentOutOfRangeException();
      int ofs = index / 4;
      int shift = (index & 3) * 2;
      int mask = 3 << shift;
      _data[ofs] = (byte)((_data[ofs] & (255 - mask)) | (value << shift));
    }
  }

}
于 2013-07-07T23:19:08.633 に答える