سؤال

أستخدم بايتًا لتخزين بعض العلامات مثل 10101010وأود أن أعرف كيفية التحقق من وجود جزء معين 1 أو 0.

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

المحلول

إليك وظيفة يمكن استخدامها لاختبار أي بت مطلوب:

bool is_bit_set(unsigned value, unsigned bitindex)
{
    return (value & (1 << bitindex)) != 0;
}

قليلا من التوضيح:

يتم استخدام عامل النقل الأيسر (<<) لإنشاء قناع البت.(1 << 0) يساوي 00000001، (1 << 1) يساوي 00000010، (1 << 3) يساوي 00001000، إلخ.لذا فإن التحول بمقدار 0 يختبر أقصى اليمين.سيكون التحول بمقدار 31 هو الجزء الموجود في أقصى اليسار من قيمة 32 بت.

يعطي عامل التشغيل bitwise-and (&) نتيجة حيث يتم تعيين جميع البتات التي تكون 1 على كلا الجانبين.أمثلة:1111 & 0001 = 0001؛1111 & 0010 == 0010;0000 و 0001 = 0000.لذا، فإن التعبير (value & (1 << bitindex)) سيعيد قناع البت إذا كانت قيمة البت المرتبط هي 1، أو سيعيد 0 إذا كانت البتة المرتبطة هي 0.

أخيرًا، نتحقق فقط مما إذا كانت النتيجة غير صفرية.(يمكن استبعاد هذا بالفعل، لكني أحب أن أوضحه.)

نصائح أخرى

كامتداد لإجابةDaoks

عند القيام بالتلاعب بالبت حقًا يساعد على الحصول على معرفة قوية جدا مشغلي bitwise.

كما أن عامل التشغيل "AND" في لغة C هو أيضًا &, ، إذن ما تريد القيام به هو:

unsigned char a = 0xAA; // 10101010 in hex
unsigned char b = (1 << bitpos); //Where bitpos is the position you want to check

if(a & b) {
    //bit set
}

else {
    //not set
}

أعلاه، استخدمت "AND" (& في C) للبت للتحقق مما إذا كان قد تم تعيين بت معين أم لا.لقد استخدمت أيضًا طريقتين مختلفتين لصياغة الأرقام الثنائية.أنصحك بشدة بمراجعة رابط ويكيبيديا أعلاه.

يمكنك استخدام عامل التشغيل AND.مثال لديك :10101010 وتريد التحقق من الجزء الثالث الذي يمكنك القيام به:(10101010 و00100000) وإذا حصلت على 00100000 فاعلم أن لديك العلم في المركز الثالث إلى 1.

إذا كنت تستخدم C++ والمكتبة القياسية مسموح بها، أقترح تخزين أعلامك في مجموعة بت:

#include <bitset>
//...
std::bitset<8> flags(someVariable);

ومن ثم يمكنك التحقق من العلامات وتعيينها باستخدام عامل الفهرسة [].

تعتبر إجابة كريستوفر جونسون جيدة جدًا إذا كنت تحب العمل في مجالات فردية مثل هذه.أفضّل أن أجعل قراءة التعليمات البرمجية أسهل باستخدام حقول البت في لغة C.

على سبيل المثال:

struct fieldsample
{
  unsigned short field1 : 1;
  unsigned short field2 : 1;
  unsigned short field3 : 1;
  unsigned short field4 : 1;
}

هنا لديك بنية بسيطة تحتوي على أربعة حقول، حجم كل منها 1 بت.ثم يمكنك كتابة التعليمات البرمجية الخاصة بك باستخدام الوصول البسيط إلى البنية.

void codesample()
{
  //Declare the struct on the stack.
  fieldsample fields;
  //Initialize values.
  fields.f1 = 1;
  fields.f2 = 0;
  fields.f3 = 0;
  fields.f4 = 1;
  ...
  //Check the value of a field.
  if(fields.f1 == 1) {}
  ...
}

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

لم يخطئ أحد حتى الآن، ولكن لإعطاء طريقة للتحقق من البت التعسفي:

int checkBit( byte in, int bit )
{
  return in & ( 1 << bit );
}

إذا كانت الدالة ترجع قيمة غير صفرية، فسيتم تعيين البت.

byte THIRDBIT = 4; // 4 = 00000100 i.e third bit is set

int isThirdBitSet(byte in) {
 return in & THIRDBIT; // Returns 1 if the third bit is set, 0 otherwise
}

يمكنك أن تفعل ما يقوله Daok وتقوم بإجراء القليل من الشيء أو نتيجة العملية AND السابقة.في هذه الحالة سيكون لديك النتيجة النهائية 1 أو 0.

تقليديًا، للتحقق مما إذا تم تعيين أقل بت، سيبدو هذا كما يلي:

int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
    doSomething();

استخدم طريقة البت (غير منطقية!) ولمقارنة القيمة بقناع البت.

if (var & 0x08) {
  /* the fourth bit is set */
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top