كيف يمكنني اختبار ما إذا كانت أنماط بت يختلف في أي بتات N (الوضع لا يهم)

StackOverflow https://stackoverflow.com/questions/1502452

  •  19-09-2019
  •  | 
  •  

سؤال

دعنا نقول أن لدي هذه القيمة الميدانية هذه: 10101001

كيف يمكنني اختبار ما إذا كانت أي قيمة أخرى تختلف في أي n بت. دون النظر في المناصب؟

مثال:

10101001
10101011 --> 1 bit different 

10101001
10111001 --> 1 bit different

10101001
01101001 --> 2 bits different

10101001
00101011 --> 2 bits different

أحتاج إلى تكوين الكثير من هذه المقارنات لذلك أنا أبحث في المقام الأول عن براعة ولكن أي تلميح هو موضع ترحيب كبير.

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

المحلول

خذ XOR للحقول والقيام بعدد السكان من النتيجة.

نصائح أخرى

إذا كنت XOR القيم 2 معا، فإنك تركت فقط مع البتات المختلفة.

عندها تحتاج فقط إلى حساب البتات التي لا تزال 1 ولديك إجابتك

في ج:

 unsigned char val1=12;
 unsigned char val2=123;
 unsigned char xored = val1 ^ val2;
 int i;
 int numBits=0;
 for(i=0; i<8; i++)
 {
      if(xored&1) numBits++;
      xored>>=1;
 }

على الرغم من أنه ربما تكون هناك طرق أسرع لحساب البتات في البايت (يمكنك على سبيل المثال، استخدم مشحونا مقابل 256 قيما)

تماما مثل أي شخص آخر قال، استخدم XOR لتحديد ما هو مختلف ثم استخدام واحدة من هذه الخوارزميات لحساب.

هذا يحصل على اختلاف الشيء بين القيم ويعتبر البتات ثلاثة في وقت واحد:

public static int BitDifference(int a, int b) {
   int cnt = 0, bits = a ^ b;
   while (bits != 0) {
      cnt += (0xE994 >> ((bits & 7) << 1)) & 3;
      bits >>= 3;
   }
   return cnt;
}

XOR الأرقام، ثم تصبح المشكلة مسألة حساب 1S في النتيجة.

في جاوة:

Integer.bitCount(a ^ b)

يتم إجراء المقارنة مع XOR، كما أجاب الآخرون بالفعل.

يمكن إجراء العد بعدة طرق:

  • تحول اليسار والإضافة.
  • البحث في طاولة.
  • الصيغ المنطقية التي يمكنك العثور عليها خرائط كارنو.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top