> 백엔드 개발 > C++ > 효율적인 메모리 사용을 달성하기 위해 C#에서 비트 필드를 어떻게 구현할 수 있습니까?

효율적인 메모리 사용을 달성하기 위해 C#에서 비트 필드를 어떻게 구현할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-12-30 18:00:21
원래의
268명이 탐색했습니다.

How Can Bit Fields Be Implemented in C# to Achieve Efficient Memory Usage?

C#의 비트 필드

비트 필드는 사용자가 지정된 숫자를 차지하는 필드로 구조를 정의할 수 있는 C의 데이터 구조입니다. 비트. 이는 제한된 메모리로 작업하거나 저장되는 데이터가 특정 비트 패턴을 따르는 경우 유용할 수 있습니다.

제공된 예에서 사용자는 여러 비트 필드가 있는 구조를 갖습니다.

  • 예약됨(2비트)
  • scrambling_control(2비트)
  • 우선순위(1 비트)
  • data_alignment_indicator(1비트)
  • 저작권(1비트)
  • original_or_copy(1비트)

내부의 개별 비트에 액세스하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿