C# - 4位值的结构

时间:2013-09-04 07:11:12

标签: c#

我必须创建一个大小为2个字节的结构。结构必须包含4个值,每个值应该有4位长度。我怎么能这样做?

在C中我可以做类似的事情:

typedef struct MyStructure
{
    uint8_t  value1   :4;
    uint8_t  value2   :4;
    uint8_t  value3   :8;
}

4 个答案:

答案 0 :(得分:2)

因为值的最小可寻址大小是字节(8位),所以不能那么容易地做到这一点。您可以创建包含两个byte字段的类型,并使用get / set属性作为4个不同的值。

public struct MyStruct
{
    private byte _ab;
    private byte _cd;

    public byte A
    {
        get { return (byte)(_ab & 15); }
        set { _ab = (byte)((_ab & 240) | (value & 15)); }
    }

    public byte B
    {
        get { return (byte)(_ab >> 4); }
        set { _ab = (byte)((_ab & 15) | (value & 240)); }
    }

    // the same for C and D
}

答案 1 :(得分:1)

除非已经有一些课程用于此目的我不知道,你最好的选择可能是按照leppie的建议使用UInt16,然后有属性来获取和设置“子值”,透明地执行掩蔽和根据需要移动。

答案 2 :(得分:1)

您可以指定两个字节并使用属性进行位访问

public struct X {
    public byte A;
    public byte B;

    public byte A_L {
        get {
            return (byte)(A >> 4);
        }
    }
    public byte A_R {
        get {
            return (byte)(A & 15);
        }
    }
    public byte B_L {
        get {
            return (byte)(B >> 4);
        }
    }
    public byte B_R {
        get {
            return (byte)(B & 15);
        }
    }
}

答案 3 :(得分:0)

您可以使用标准UInt16类型(根本没有显式结构):

  UInt16 value = ...

  // Get corresponding values:

  Byte value1 = (Byte) (value >> 12);
  Byte value2 = (Byte) ((value >> 8) & 0xF);
  Byte value3 = (Byte) (value & 0xF);

  // Set corresponding values

  UInt16 value = (UInt16) ((value1 << 12) | (value & 0x0FFF));
  UInt16 value = (UInt16) ((value2 << 8) | (value & 0xF0FF));
  UInt16 value = (UInt16) (value3 | (value & 0xFF00));