C#의 비트 필드
다음 C# 코드는 구조 내에서 비트 필드를 생성하고 도트 연산자를 사용하여 비트 액세스를 활성화하는 방법을 보여줍니다.
using System; namespace BitfieldTest { [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; foreach (var f in t.GetType().GetFields()) { var attrs = f.GetCustomAttributes(typeof(BitfieldLengthAttribute), false); if (attrs.Length == 1) { uint fieldLength = ((BitfieldLengthAttribute)attrs[0]).Length; long mask = 0; for (int i = 0; i < fieldLength; i++) mask |= 1L << 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(); } } }
이에는 코드:
이것은 접근 방식을 사용하면 비트 필드를 쉽게 조작할 수 있으므로 비트 지향 데이터 형식을 처리하는 데 특히 유용합니다.
위 내용은 속성을 사용하여 C#에서 비트 필드를 어떻게 구현하고 액세스할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!