كيف يمكنني حساب عدد البتات المحددة في uint في specman؟
-
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، والذي يخرج لعدد من مجموعة بت.