المسارات
/
Gleam
Gleam
/
المنهج
/
مصفوفات البتات
مص

مصفوفات البتات في Gleam

تمرينان

نبذة عن مصفوفات البتات

قد يكون التعامل مع البيانات الثنائية شائكًا، لذلك توفر Gleam نوع BitArray وصيغة مرافقة لإنشاء البيانات الثنائية ومطابقة أنماطها.

تُعرَّف القيم الحرفية لمصفوفات البتات باستخدام صيغة <<>>. عند تعريف قيمة حرفية لمصفوفة بتات، تُعرَّف على شكل مقاطع. لكل مقطع قيمة وتوصيف، يفصل بينهما :. يحدد التوصيف عدد البتات التي ستُستخدم لترميز القيمة، ويمكن حذفه بالكامل، وعندها ستكون القيمة الافتراضية عددًا صحيحًا من 8 بتات.

// This defines a bit array with three segments of a single bit each
<<0:1, 1:1, 0:1>>

// This defines a bit array with three segments of 8 bits each
<<0, 1, 0>>

تحديد النوع بالشكل :1 هو اختصار لكتابة :size(1). تحتاج إلى استخدام الصيغة الأطول إذا كان حجم البتات قادمًا من متغير.

let segment_size = 1
<<0:size(segment_size), 1:size(segment_size), 0:size(segment_size)>>

الثنائي

عند كتابة قيم حرفية صحيحة ثنائية، يمكننا كتابتها مباشرة بترميز الأساس 2 عبر إضافة البادئة 0b إلى القيمة الحرفية. لاحظ أنها ستُعرض كأعداد عشرية عند طباعتها في الاختبارات أو في برنامجك.

<<0b1011:4>> == <<11:4>>
// -> True

الاقتطاع

إذا تجاوزت قيمة المقطع سعة نوع المقطع، فستُقتطع من اليسار.

<<0b1011:3>> == <<0b0011:3>>
// -> True

الإضافة في البداية والنهاية

يمكنك الإضافة في بداية مصفوفة بتات موجودة وفي نهايتها باستخدام صيغة مصفوفة البتات. يجب استخدام التوصيف :bits لمصفوفة البتات الموجودة.

let value = <<0b110:3, 0b001:3>>
let new_value = <<0b011:3, value:bits, 0b000:3>>
// -> <<120, 8:size(4)>>

الدمج

يمكننا دمج مصفوفات البتات المخزنة في متغيرات باستخدام الصيغة. يجب استخدام التوصيف :bits عند دمج مصفوفتي بتات بحجمين متغيرين.

let first = <<0b110:3>>
let second = <<0b001:3>>
let concatenated = <<first:bits, second:bits>>
// -> <<49:size(6)>>

مطابقة الأنماط

يمكن أيضًا إجراء مطابقة الأنماط للحصول على قيم من مصفوفة البتات. عليك معرفة عدد البتات لكل جزء تريد التقاطه، مع استثناء واحد: يمكن استخدام التوصيف :bits لمطابقة الأنماط على مصفوفة بتات بحجم غير معروف، لكن هذا لا يمكن استخدامه إلا للجزء الأخير.

let assert <<value:4, rest:bits>> = <<0b01101001:8>>
value == 0b0110
// -> true

فحص مصفوفات البتات

Note

قد تُطبع مصفوفات البتات بتنسيق مختلف عن التنسيق الذي استُخدم لإنشائها. غالبًا ما يسبب هذا ارتباكًا عند تعلّم مصفوفات البتات.

بشكل افتراضي، تُعرض مصفوفات البتات في أجزاء من 8 بتات (بايت)، حتى لو أنشأتها بأجزاء بحجم مختلف.

<<2011:11>>
// -> <<251, 3:size(3)>>

إذا أنشأت مصفوفة بتات تمثل سلسلة نصية قابلة للطباعة مرمّزة بترميز UTF-8، فقد تُعرض كسلسلة نصية باستخدام echo keyword عند الاستهداف إلى Erlang. يعود هذا إلى تفصيل في التنفيذ يتعلق بكيفية تمثيل Gleam للسلاسل النصية داخليًا.

<<>>
// -> ""

<<65, 66, 67>>
// -> "ABC"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم مصفوفات البتات