كيف يمكنني حساب عدد البتات المحددة في uint في specman؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

أريد حساب عدد البتات المحددة في uint في Specman:

var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;

ما هي الطريقة الأفضل لعمل هذا؟

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

المحلول

لا أعرف Specman، لكن الطريقة الأخرى التي رأيت بها هذا الأمر تبدو مبتذلة بعض الشيء، ولكنها تميل إلى أن تكون فعالة:احتفظ بمصفوفة مكونة من 256 عنصرًا؛يتكون كل عنصر في المصفوفة من عدد البتات المقابلة لتلك القيمة.على سبيل المثال (الكود الزائف):

bit_count = [0, 1, 1, 2, 1, ...]

وهكذا، bit_count2 == 1، لأن القيمة 2، في النظام الثنائي، تحتوي على بت واحد "1".وبالمثل، bit_count[255] == 8.

بعد ذلك، قم بتقسيم uint إلى بايت، واستخدم قيم البايت للفهرسة في مصفوفة bit_count، وأضف النتائج.كود مزيف:

total = 0
for byte in list_of_bytes
    total = total + bit_count[byte]

يحرر

تظهر هذه المشكلة في الكتاب كود جميل, ، في الفصل الذي كتبه هنري س.وارن.كما يعرض Matt Howells تطبيق لغة C الذي يحسب عدد البتات بكفاءة.يرى هذه الإجابة.

نصائح أخرى

وإحدى الطرق التي رأيتها هي:

x_set_bits = pack(NULL, x).count(it == 1);

وpack(NULL, x) يحول x إلى قائمة من البتات.
يعمل count على لائحة وتعول على جميع العناصر التي تحمل الشرط. في هذه الحالة أن الشرط هو أن العنصر يساوي 1، والذي يخرج لعدد من مجموعة بت.

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