タイル ベースの 2D プラットフォーマーを作成していますが、メモリのすべてのバイトが貴重です。0 から 255 までの値を保持できる 1 つのバイト フィールドがありますが、値が 0 から 15 の 2 つのプロパティが必要です。そのような 1 つのバイト フィールドを 2 つのプロパティに変換するにはどうすればよいですか?
質問する
142 次
3 に答える
8
一方の値に下位 4 ビットを使用し、もう一方の値に上位 4 ビットを使用するということですか?
1バイトの使用から2つの値を取得するには...
a = byte & 15;
b = byte / 16;
設定はちょうど逆です
byte = a | b * 16;
シフト演算子を使用する方が優れていますが、最近では通常、コンパイラ オプティマイザがこれを行います。
byte = a | (b << 4);
于 2013-01-07T16:47:25.197 に答える
3
sradforth の回答に便乗して、プロパティに関する質問に答えるには:
private byte _myByte;
public byte LowerHalf
{
get
{
return (byte)(_myByte & 15);
}
set
{
_myByte = (byte)(value | UpperHalf * 16);
}
}
public byte UpperHalf
{
get
{
return (byte)(_myByte / 16);
}
set
{
_myByte = (byte)(LowerHalf | value * 16);
}
}
于 2013-01-07T17:04:47.363 に答える
1
以下に、いくつかのプロパティといくつかのバッキング ストアを示します。ロジックを簡単に理解できるように記述してみました。
private byte HiAndLo = 0;
private const byte LoMask = 15; // 00001111
private const byte HiMask = 240; // 11110000
public byte Lo
{
get
{
// ----&&&&
return (byte)(this.hiAndLo & LoMask);
}
set
{
if (value > LoMask) //
{
// Values over 15 are too high.
throw new OverflowException();
}
// &&&&0000
// 0000----
// ||||||||
this.hiAndLo = (byte)((this.hiAndLo & HiMask) | value);
}
}
public byte Hi
{
get
{
// &&&&XXXX >> 0000&&&&
return (byte)((this.hiAndLo & HiMask) >> 4);
}
set
{
if (value > LoMask)
{
// Values over 15 are too high.
throw new OverflowException();
}
// -------- << ----0000
// XXXX&&&&
// ||||||||
this.hiAndLo = (byte)((hiAndLo & LoMask) | (value << 4 ));
}
}
于 2013-01-07T17:20:27.237 に答える