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; } } }
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!