سؤال

ماذا يكون ال CreateMask() وظيفة BitVector32 يفعل؟لم أفهم ما هو القناع.

أود أن أفهم الأسطر التالية من التعليمات البرمجية.هل يقوم إنشاء قناع بتعيين البت إلى صحيح؟

  // Creates and initializes a BitVector32 with all bit flags set to FALSE.
  BitVector32 myBV = new BitVector32( 0 );

  // Creates masks to isolate each of the first five bit flags.
  int myBit1 = BitVector32.CreateMask();
  int myBit2 = BitVector32.CreateMask( myBit1 );
  int myBit3 = BitVector32.CreateMask( myBit2 );
  int myBit4 = BitVector32.CreateMask( myBit3 );
  int myBit5 = BitVector32.CreateMask( myBit4 );

  // Sets the alternating bits to TRUE.
  Console.WriteLine( "Setting alternating bits to TRUE:" );
  Console.WriteLine( "   Initial:         {0}", myBV.ToString() );
  myBV[myBit1] = true;
  Console.WriteLine( "   myBit1 = TRUE:   {0}", myBV.ToString() );
  myBV[myBit3] = true;
  Console.WriteLine( "   myBit3 = TRUE:   {0}", myBV.ToString() );
  myBV[myBit5] = true;
  Console.WriteLine( "   myBit5 = TRUE:   {0}", myBV.ToString() );

ما هو التطبيق العملي لذلك؟

هل كانت مفيدة؟

المحلول

BitVector32.CreateMask() هو إجراء تبديل للمشغل التحول الأيسر (<<) والتي في معظم الحالات النتائج في الضرب 2 (تحول اليسار ليس تعميما، لذلك قد بدء فقدان أرقام، ويفسر أكثر <لأ href = "https://stackoverflow.com/questions/141525 / مطلق-مبتدئين دليل-إلى بت التحول "> هنا )

BitVector32 vector = new BitVector32();
int bit1 = BitVector32.CreateMask();
int bit2 = BitVector32.CreateMask(bit1);
int bit3 = 1 << 2;
int bit5 = 1 << 4;

Console.WriteLine(vector.ToString());
vector[bit1 | bit2 | bit3 | bit5] = true;
Console.WriteLine(vector.ToString());

وإخراج:

<اقتباس فقرة>   

وBitVector32 {} 00000000000000000000000000000000   BitVector32 {00000000000000000000000000010111}

نصائح أخرى

وتقوم بإرجاع قناع والتي يمكنك استخدامها لتسهيل استرجاع من الشيء المثير للاهتمام.

وقد ترغب في تحقق من ويكيبيديا للحصول على ما هو قناع.

وباختصار: قناع هو نمط في شكل مجموعة من 1S لالبتات التي كنت مهتما في و0S للآخرين.

إذا كان لديك شيء من هذا القبيل 01010 وكنت مهتما في الحصول على 3 بت الماضية، القناع الخاص بك ستبدو 00111. ثم، عند إجراء أحادي المعامل AND على 01010 و00111 ستحصل البتات الثلاثة الماضية (00010)، منذ AND فقط هو 1 إذا تم تعيين كل من البتات، ويتم تعيين أي من البتات بجانب الثلاثة الأولى في القناع.

وعلى سبيل المثال قد يكون من الأسهل فهم:

BitVector32.CreateMask() => 1 (binary 1)
BitVector32.CreateMask(1) => 2 (binary 10)
BitVector32.CreateMask(2) => 4 (binary 100)
BitVector32.CreateMask(4) => 8 (binary 1000)

وCreateMask(int) بإرجاع عدد معين مضروبا 2.

ملاحظة : ل. بت الأول هو أقل قليلا كبير، أي أبعد قليلا إلى اليمين

تحقق من هذا المنصب الآخر نص الرابط.وأيضًا إنشاء قناع لا قم بإرجاع الرقم المحدد مضروبًا في 2.يقوم CreateMask بإنشاء قناع بت بناءً على موضع محدد في الكلمة ذات 32 بت (هذه هي المعلمة التي تقوم بتمريرها)، والتي تكون بشكل عام x^2 عندما تتحدث عن بت واحد (علامة).

تعثرت في هذا السؤال في محاولة لمعرفة ما CreateMask يفعل بالضبط.لم أشعر أن الإجابات الحالية تجيب على السؤال بالنسبة لي.بعد بعض القراءة والتجربة، أود أن أشارككم النتائج التي توصلت إليها:

في الأساس ما يقوله ماكسيميليان صحيح تمامًا:"BitVector32.CreateMask هو بديل لمشغل التحول الأيسر (<<) والذي يؤدي في معظم الحالات إلى الضرب بـ 2".

نظرًا لأن << هو عامل تشغيل ثنائي وأن CreateMask يأخذ وسيطة واحدة فقط، أود إضافتها BitVector32.CreateMask(x) يعادل x << 1.

الحدود

لكن، BitVector32.CreateMask(x) لا يعادل x << 1 لحالتين حدوديتين:

  1. BitVector32.CreateMask(int.MinValue):
    سيتم طرح InvalidOperationException. int.MinValue يتوافق مع 10000000000000000000000000000000.هذا يبدو غريبا بعض الشيء.لا سيما بالنظر إلى كل قيمة أخرى ذات الرقم 1 باعتبارها البتة في أقصى اليسار (أي.الأرقام السالبة) يعمل بشكل جيد.في المقابل: int.MinValue << 1 لن يلقي استثناءً ويعود فقط 0.

  2. عندما تتصل BitVector32.CreateMask(0) (أو BitVector32.CreateMask()).هذا سوف يعود 1
    (أي. 00000000000000000000000000000000 يصبح 00000000000000000000000000000001),
    في حين أن 0 << 1 سيرجع 0 فقط.

الضرب في 2

إن CreateMask دائمًا تقريبًا يعادل الضرب في 2.بخلاف الحالتين الخاصتين المذكورتين أعلاه، ويختلف عندما تكون البتة الثانية من اليسار مختلفة عن البتة الموجودة في أقصى اليسار.تم توقيع int، لذا يشير الجزء الموجود في أقصى اليسار إلى الإشارة.في هذا السيناريو يتم قلب العلامة.على سبيل المثال CreateMask(-1) (أو 11111111111111111111111111111111) النتائج في -2 (أو 11111111111111111111111111111110)، لكن CreateMask(int.MaxValue) (أو 01111111111111111111111111111111) يؤدي أيضًا إلى -2.

على أية حال، ربما لا ينبغي عليك استخدامه لهذا الغرض.كما أفهم، عند استخدام BitVector32، يجب عليك اعتباره سلسلة من 32 بت فقط.ربما تكون حقيقة أنهم يستخدمون ints مع BitVector32 لأنها مريحة.

متى يكون CreateMask مفيدًا؟

أنا بصراحة لا أعرف.ويبدو من توثيق والاسم "السابق" لوسيطة الوظيفة التي كانوا يعتزمون استخدامها في نوع من التسلسل:"استخدم CreateMask() لإنشاء القناع الأول في سلسلة وCreateMask(int) لجميع الأقنعة اللاحقة.".

ومع ذلك، في مثال التعليمات البرمجية، يستخدمونه لإنشاء أقنعة للبتات الخمس الأولى، للقيام ببعض العمليات لاحقًا على تلك البتات.لا أستطيع أن أتخيل أنهم يتوقعون منك كتابة 32 مكالمة متتالية إلى CreateMask لتتمكن من القيام ببعض الأشياء باستخدام البتات القريبة من اليسار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top