• 0
هاني الأتاسي

سلسلة - شغل مخك (2)

سؤال

ماهي أفضل طريقة من أجل عد الواحدات في عدد يتكون من 32 بت؟

مثلا 10 تحتوي على واحدتين لأنها تكتب 1010 ...

:) :) من غير استخدام حلقة ؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

13 إجابة على هذا السؤال .

  • 0

يا سلام ....

اقدر اكتبها بالاسمبلي

عملية ازاحة و مقارنة ال carry flag، و زيادة العداد .

اتمنى ان نشوف الطريقة ... وتكون ذكية .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هذه هي الطريقة بس مو من عندي لذلك ماحد يسألني شرحها (light)


x -= ((x >> 1) & 0x55555555);
x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
x = (((x >> 4) + x) & 0x0f0f0f0f);
x += (x >> 8);
x += (x >> 16);
return(x & 0x0000003f);

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

هاني بدي اسألك :P :P :P

(f)

CIONO1

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

فيه كود اخر


x = (x & 0x55555555) + ((x & 0xaaaaaaaa) >> 1);
x = (x & 0x33333333) + ((x & 0xcccccccc) >> 2);
x = (x & 0x0f0f0f0f) + ((x & 0xf0f0f0f0) >> 4);
x = (x & 0x00ff00ff) + ((x & 0xff00ff00) >> 8);
x = (x & 0x0000ffff) + ((x & 0xffff0000) >> 16);
return(x);

او


x = (0x55555555 & x) + (0x55555555 & (x>> 1));
x = (0x33333333 & x) + (0x33333333 & (x>> 2));
x = (0x0f0f0f0f & x) + (0x0f0f0f0f & (x>> 4));
x = (0x00ff00ff & x) + (0x00ff00ff & (x>> 8));
x = (0x0000ffff & x) + (0x0000ffff & (x>>16));
return x;

CIONO1

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اول ما قلتوا ما فيه حلقة ...

وقف مخي !!! و بالكود هذا فجرتوا مخي ...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ياجماعة في احد فاهم شو هالكود ؟

انا لم افهم على اي اساس تم ذلك .

:'( :'( :'(

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

حلو فهمت أحد هذه الكودات ... وياللي خلاني أفهمو حل لسؤال عكس الواحدات ..

سوف أشرح هذا الكود :


x = (x & 0x55555555) + ((x & 0xaaaaaaaa) >> 1);
x = (x & 0x33333333) + ((x & 0xcccccccc) >> 2);
x = (x & 0x0f0f0f0f) + ((x & 0xf0f0f0f0) >> 4);
x = (x & 0x00ff00ff) + ((x & 0xff00ff00) >> 8);
x = (x & 0x0000ffff) + ((x & 0xffff0000) >> 16);
return(x);

ببساطة عملية العد هنا تبدأ بالتدريج ..

أول سطر يقوم ب عد كل بتين متجاورين .. على فرض عدد 8 بتات :


a = 10101101

then
10101101
01010101 &
--------------
00000101 = x

10101101
10101010 &
--------------
10101000 = y

then
x + y >> 1 means

00000101
01010100
--------------
01011001 == 0x1121

بعد تنفيذ أول سطر نحصل على عدد يحتوي في كل بتين على القيمة 0 أو 1 أو 2 وهي تمثل عدد الواحدات في هاتين البتين ..

الأسطر التي بعدها مشابهة .. مثلا السطر التاني يقوم بجمع القيم على اعتبار أخذ بلوكات حجمها 2

السطر التالي بلوكات حجمها 4 ومن ثم 8 ومن ثم 16 ... :)

أما الكود الأول الذي ذكرته هنا فهو مشابه ولكنه مكتوب بطريق أخرى أفضل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحبا ........ :)

يا الله الموضوع هذا طلع من وين :rolleyes:

هذا من أيام الأخ هاني الأتاسي ذكره الله بالخير ..

بالمناسبة في أحد يعرف أين ذهب الأعضاء القدامى ؟؟؟؟

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .