Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Medan Bit dengan Cekap dalam C# Menggunakan Atribut dan Dereferencing Struktur?

Bagaimana untuk Melaksanakan Medan Bit dengan Cekap dalam C# Menggunakan Atribut dan Dereferencing Struktur?

DDD
Lepaskan: 2025-01-05 04:28:40
asal
764 orang telah melayarinya

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

Pelaksanaan medan bit dalam C

Medan bit ialah cara yang berguna untuk membungkus berbilang nilai boolean ke dalam satu bait atau perkataan, membolehkan penyimpanan dan manipulasi bendera yang cekap dan data seperti boolean yang lain. Dalam C, medan bit ditakrifkan menggunakan kata kunci struct, diikuti dengan satu siri ahli medan bit, setiap satunya menentukan bilangan bit untuk diperuntukkan untuk ahli tersebut.

Dalam soalan StackOverflow ini, pengguna bertanya tentang satu cara untuk melaksanakan medan bit dalam C# yang akan membolehkan mengakses bit menggunakan operator titik penyahrujukan struktur. Persoalannya timbul daripada keperluan untuk mengendalikan berbilang struktur dengan ahli medan bit.

Satu penyelesaian yang dicadangkan ialah menggunakan atribut dan kelas penukaran untuk menterjemahkan struktur yang dikaitkan dengan sewajarnya kepada primitif medan bit. Atribut digunakan untuk menentukan panjang setiap ahli medan bit dan kelas penukaran bertanggungjawab untuk menukar struktur beranotasi kepada perwakilan medan bit yang sesuai.

Berikut ialah contoh bagaimana pelaksanaan sedemikian mungkin kelihatan seperti:

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;
        }
    }
}
Salin selepas log masuk

Pendekatan ini menawarkan peningkatan kebolehbacaan kod dan penulisan yang lebih pantas, menjadikannya lebih cekap dalam mengendalikan pelbagai struktur dengan ahli medan bit.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Medan Bit dengan Cekap dalam C# Menggunakan Atribut dan Dereferencing Struktur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan