비트 필드는 여러 부울 값을 단일 바이트 또는 단어로 묶는 유용한 방법으로, 플래그 및 플래그를 효율적으로 저장하고 조작할 수 있습니다. 다른 불리언형 데이터. C에서 비트 필드는 struct 키워드와 일련의 비트 필드 멤버를 사용하여 정의되며, 각 멤버는 해당 멤버에 할당할 비트 수를 지정합니다.
이 StackOverflow 질문에서 사용자는 다음에 대해 문의합니다. 구조체 역참조 도트 연산자를 사용하여 비트에 액세스할 수 있도록 C#에서 비트 필드를 구현하는 방법입니다. 문제는 비트 필드 멤버가 있는 여러 구조를 처리해야 할 필요성에서 발생합니다.
제안되는 솔루션 중 하나는 속성 및 변환 클래스를 활용하여 적절하게 속성이 지정된 구조를 비트 필드 프리미티브로 변환하는 것입니다. 속성은 각 비트 필드 멤버의 길이를 지정하는 데 사용되며 변환 클래스는 주석이 달린 구조를 적절한 비트 필드 표현으로 변환하는 역할을 담당합니다.
다음은 이러한 구현의 예입니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!