我正在制作一个基于 tile 的 2d 平台游戏,每个字节的内存都是宝贵的。我有一个字节字段可以保存从 0 到 255 的值,但我需要的是两个值为 0~15 的属性。我怎样才能将一个字节字段变成两个这样的属性?
问问题
142 次
3 回答
8
您的意思是仅将低 4 位用于一个值,将高 4 位用于另一个值?
要从 1 个字节中获取两个值,请使用...
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 回答