簡體   English   中英

如何獲得兩個(0〜15)個數字作為屬性,以一個字節作為后備字段?

[英]How to get two (0~15) numbers as properties with one byte as backing field?

我正在制作基於圖塊的2d平台程序,並且每個字節的內存都很寶貴。 我有一個字節字段,可以保存從0到255的值,但是我需要兩個值為0〜15的屬性。 我如何將一個字節字段變成這樣的兩個屬性?

您的意思是只將低4位用於一個值,將高4位用於另一個值?

從1個字節中獲取兩個值,使用...

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

設置只是相反

byte = a | b * 16;

使用shift運算符會更好,但是如今,編譯器優化器通常會為您執行此操作。

byte = a | (b << 4);

擺脫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);
    }
}

以下是一些屬性和一些后備存儲,我試圖以一種易於理解的方式編寫它們。

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 )); 
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM