サイズが 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
2 つのフィールドを持つタイプを作成し、プロパティを使用して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
}
私が知らないこの目的のためのクラスがすでに存在しない限り、あなたの最善の策はUInt16
、leppie によって提案されているように、おそらく a を使用し、「サブ値」を取得および設定するプロパティを持ち、必要に応じてマスキングとシフトを透過的に実行することです。
2 バイトを指定し、ビット アクセスのプロパティを使用できます。
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));