C#의 비트 필드
비트 필드는 사용자가 지정된 숫자를 차지하는 필드로 구조를 정의할 수 있는 C의 데이터 구조입니다. 비트. 이는 제한된 메모리로 작업하거나 저장되는 데이터가 특정 비트 패턴을 따르는 경우 유용할 수 있습니다.
제공된 예에서 사용자는 여러 비트 필드가 있는 구조를 갖습니다.
내부의 개별 비트에 액세스하려면 C#의 비트필드에서는 도트 연산자를 사용할 수 있습니다. 그러나 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; } } }
이 코드는 000101011이라는 예상 결과를 생성합니다. 이 솔루션은 재사용이 가능하며 비트 필드를 사용하여 구조를 쉽게 유지 관리할 수 있습니다.
위 내용은 효율적인 메모리 사용을 달성하기 위해 C#에서 비트 필드를 어떻게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!