我必须创建一个大小为 2 个字节的结构。该结构必须包含 4 个值,每个值都应该有 4 位长度。我怎样才能做到这一点?
在 CI 中可以执行以下操作:
typedef struct MyStructure
{
uint8_t value1 :4;
uint8_t value2 :4;
uint8_t value3 :8;
}
我必须创建一个大小为 2 个字节的结构。该结构必须包含 4 个值,每个值都应该有 4 位长度。我怎样才能做到这一点?
在 CI 中可以执行以下操作:
typedef struct MyStructure
{
uint8_t value1 :4;
uint8_t value2 :4;
uint8_t value3 :8;
}
因为值的最小可寻址大小是字节(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
}
除非我不知道已经有一些用于此目的的类,否则您最好的选择可能是使用 a UInt16
,正如 leppie 所建议的那样,然后具有获取和设置“子值”的属性,透明地执行掩蔽和移动根据需要。
您可以指定两个字节并使用属性进行位访问
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);
}
}
}
您可以使用标准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));