ビット フィールドは、複数のブール値を 1 つのバイトまたはワードにパックする便利な方法であり、フラグやフラグの効率的な保存と操作を可能にします。他のブール値のようなデータ。 C では、ビット フィールドは struct キーワードを使用して定義され、その後に一連のビット フィールド メンバーが続きます。各メンバーは、そのメンバーに割り当てるビット数を指定します。
この StackOverflow の質問では、ユーザーは以下について問い合わせています。 C# でビット フィールドを実装する方法。構造体の逆参照ドット演算子を使用してビットにアクセスできるようになります。この問題は、ビット フィールド メンバーを含む複数の構造体を処理する必要があることから生じます。
提案される解決策の 1 つは、属性と変換クラスを利用して、適切に属性が付けられた構造体をビット フィールド プリミティブに変換することです。属性は各ビット フィールド メンバーの長さを指定するために使用され、変換クラスは注釈付きの構造を適切なビット フィールド表現に変換する役割を果たします。
そのような実装がどのように見えるかの例を次に示します。
using System; namespace BitfieldTest { [global::System.AttributeUsage(AttributeTargets.Field, AllowMultiple = false)] sealed class BitfieldLengthAttribute : Attribute { uint length; public BitfieldLengthAttribute(uint length) { this.length = length; } public uint Length { get { return length; } } } static class PrimitiveConversion { public static long ToLong<T>(T t) where T : struct { long r = 0; int offset = 0; // For every field suitably attributed with a BitfieldLength foreach (System.Reflection.FieldInfo f in t.GetType().GetFields()) { object[] attrs = f.GetCustomAttributes(typeof(BitfieldLengthAttribute), false); if (attrs.Length == 1) { uint fieldLength = ((BitfieldLengthAttribute)attrs[0]).Length; // Calculate a bitmask of the desired length long mask = 0; for (int i = 0; i < fieldLength; i++) mask |= 1 << i; r |= ((UInt32)f.GetValue(t) & mask) << offset; offset += (int)fieldLength; } } return r; } } struct PESHeader { [BitfieldLength(2)] public uint reserved; [BitfieldLength(2)] public uint scrambling_control; [BitfieldLength(1)] public uint priority; [BitfieldLength(1)] public uint data_alignment_indicator; [BitfieldLength(1)] public uint copyright; [BitfieldLength(1)] public uint original_or_copy; }; public class MainClass { public static void Main(string[] args) { PESHeader p = new PESHeader(); p.reserved = 3; p.scrambling_control = 2; p.data_alignment_indicator = 1; long l = PrimitiveConversion.ToLong(p); for (int i = 63; i >= 0; i--) { Console.Write(((l & (1l << i)) > 0) ? "1" : "0"); } Console.WriteLine(); return; } } }
このアプローチにより、コードの可読性が向上し、書き込みが高速化され、ビット フィールド メンバーを含む多数の構造体をより効率的に処理できるようになります。
以上が属性と構造体の逆参照を使用して C# でビット フィールドを効率的に実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。