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