>백엔드 개발 >C++ >특성 및 구조체 역참조를 사용하여 C#에서 비트 필드를 효율적으로 구현하는 방법은 무엇입니까?

특성 및 구조체 역참조를 사용하여 C#에서 비트 필드를 효율적으로 구현하는 방법은 무엇입니까?

DDD
DDD원래의
2025-01-05 04:28:40806검색

How to Efficiently Implement Bit Fields in C# Using Attributes and Struct Dereferencing?

C의 비트 필드 구현

비트 필드는 여러 부울 값을 단일 바이트 또는 단어로 묶는 유용한 방법으로, 플래그 및 플래그를 효율적으로 저장하고 조작할 수 있습니다. 다른 불리언형 데이터. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.