如何将两个(0~15)数字作为属性,一个字节作为后备字段?

时间:2013-01-07 16:42:43

标签: c# properties byte

我正在制作一个基于瓷砖的2d平台游戏,每个内存字节都很珍贵。我有一个字节字段可以保存0到255之间的值,但我需要的是值为0~15的两个属性。如何将一个字节字段转换为两个属性?

3 个答案:

答案 0 :(得分:8)

你的意思是只使用低4位用于一个值而高4位用于另一个值吗?

从1个字节中获取两个值...

a = byte & 15;
b = byte / 16;

设置与

相反
byte = a | b * 16;

使用shift运算符更好,但编译器优化器现在通常会为您执行此操作。

byte = a | (b << 4);

答案 1 :(得分: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);
    }
}

答案 2 :(得分: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 )); 
    }
}