बाइनरी डेटा के साथ काम करना मुश्किल हो सकता है। इसलिए 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
बिट ऐरे किसी और फॉर्मैट में छप सकते हैं, उस फॉर्मैट से अलग जिसमें उन्हें बनाया गया था। बिट ऐरे सीखते समय यह अक्सर उलझन पैदा करता है।
डिफॉल्ट रूप से बिट ऐरे 8 बिट के टुकड़ों (यानी एक बाइट) में प्रदर्शित होते हैं, चाहे आपने उन्हें किसी और साइज़ के टुकड़ों में बनाया हो।
<<2011:11>>
// -> <<251, 3:size(3)>>
अगर आप ऐसा बिट ऐरे बनाएँ जो छापने योग्य UTF-8 एनकोडेड स्ट्रिंग को दर्शाता है, तो Erlang को लक्ष्य बनाते समय echo keyword इस्तेमाल करने पर वह स्ट्रिंग के रूप में प्रदर्शित हो सकता है। ऐसा इसलिए होता है कि Gleam अंदर से स्ट्रिंग को कैसे दर्शाता है, यह उसके इम्प्लीमेंटेशन की एक बारीकी है।
<<>>
// -> ""
<<65, 66, 67>>
// -> "ABC"