کار کردن با دادههای دودویی میتواند دشوار باشد، به همین دلیل Gleam یک نوع BitArray و نحوهی نگارش همراه آن را برای ساختن و تطبیق الگو روی دادههای دودویی فراهم میکند.
لیترالهای «آرایهی بیتی» با نحوهی نگارش <<>> تعریف میشوند. وقتی یک لیترال آرایهی بیتی تعریف میکنید، بهصورت «قطعه»هایی تعریف میشود. هر قطعه یک مقدار و یک «حاشیهنویسی» دارد که با : از هم جدا میشوند. حاشیهنویسی مشخص میکند که برای رمزگذاری مقدار از چند بیت استفاده میشود و میتواند کاملاً حذف شود، که در این صورت بهطور پیشفرض یک مقدار صحیح ۸ بیتی در نظر گرفته میشود.
// 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)>>
وقتی لیترالهای صحیح دودویی مینویسیم، میتوانیم آنها را مستقیماً با نشانهگذاری مبنای ۲ بنویسیم و پیش از لیترال 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
آرایههای بیتی ممکن است در قالبی متفاوت از قالبی که برای ساختنشان استفاده شده چاپ شوند. این موضوع اغلب هنگام یادگیری آرایههای بیتی باعث سردرگمی میشود.
بهطور پیشفرض، آرایههای بیتی در تکههای ۸ بیتی (یک بایت) نمایش داده میشوند، حتی اگر آنها را با تکههایی با اندازهی متفاوت ساخته باشید.
<<2011:11>>
// -> <<251, 3:size(3)>>
اگر آرایهی بیتیای بسازید که نمایندهی یک رشتهی رمزگذاریشدهی UTF-8 قابل چاپ باشد، ممکن است هنگام هدفگیری Erlang با استفاده از echo keyword بهصورت یک رشته نمایش داده شود. این به دلیل یک جزئیات پیادهسازی در نحوهی نمایش داخلی رشتهها در Gleam است.
<<>>
// -> ""
<<65, 66, 67>>
// -> "ABC"