كيف يمكنني اختبار ما إذا كانت أنماط بت يختلف في أي بتات N (الوضع لا يهم)
-
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، كما أجاب الآخرون بالفعل.
يمكن إجراء العد بعدة طرق:
- تحول اليسار والإضافة.
- البحث في طاولة.
- الصيغ المنطقية التي يمكنك العثور عليها خرائط كارنو.