ではC私はこのような何かを行うことができます。
struct byte_nibbles {
unsigned char b1: 4;
unsigned char b2: 4;
unsigned char b3: 4;
unsigned char b4: 4;
unsigned char b5: 4;
unsigned char b6: 4;
unsigned char b7: 4;
unsigned char b8: 4;
};
union {
unsigned long var;
struct byte_nibbles b;
}
u;
int main(void)
{
u.b.b1=0x01; u.b.b2=0x02; u.b.b3=0x03; u.b.b4=0x04;
u.b.b5=0x05; u.b.b6=0x06; u.b.b7=0x07; u.b.b8=0x08;
return 0;
}
したがって、byte_nibblesの特定の部分にアクセスできます。明らかに、これはほんの一例です。基本タイプに適合する任意のサイズのビットフィールドを作成することが可能です。
私の努力と多くの研究にもかかわらず、Swiftでこれを行う方法を理解できませんでした。ビット単位を使用して同じ結果を得ることができますが、これは読みやすくエレガントではありません。
何か案が?
Swiftは単にビットフィールドをサポートしていないため、
Int8
)次に大きい整数型を使用し、変数がより多くのメモリを必要とすることを受け入れるか、または2番目のケースでは、アクセスを容易にするためにカスタム計算プロパティを定義できます。例として:
extension UInt8 {
var lowNibble : UInt8 {
get {
return self & 0x0F
}
set(newValue) {
self = (self & 0xF0) | (newValue & 0x0F)
}
}
var highNibble : UInt8 {
get {
return (self & 0xF0) >> 4
}
set(newValue) {
self = (self & 0x0F) | ((newValue & 0x0F) << 4)
}
}
}
var byte : UInt8 = 0
byte.lowNibble = 0x01
byte.highNibble = 0x02
print(byte.lowNibble)
print(byte.highNibble)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加