Tracks
/
Gleam
Gleam
/
Temario
/
Arrays de bits
Ar

Arrays de bits en Gleam

2 ejercicios

Acerca de Arrays de bits

Trabajar con datos binarios puede ser complicado, así que Gleam proporciona un tipo BitArray y una sintaxis asociada para construir datos binarios y para hacer coincidencia de patrones con ellos.

Los literales de bit array se definen con la sintaxis <<>>. Al definir un literal de bit array, este se define por segmentos. Cada segmento tiene un valor y una anotación, separados por :. La anotación especifica cuántos bits se usarán para codificar el valor y se puede omitir por completo, en cuyo caso se usa por defecto un valor entero de 8 bits.

// 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>>

Especificar el tipo como :1 es una forma abreviada de escribir :size(1). Tienes que usar la sintaxis larga si el tamaño en bits proviene de una variable.

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

Binario

Al escribir literales enteros binarios, podemos escribirlos directamente en notación en base 2 anteponiendo 0b al literal. Ten en cuenta que se mostrarán como números decimales cuando se impriman en los tests o en tu programa.

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

Truncamiento

Si el valor del segmento desborda la capacidad del tipo del segmento, se truncará por la izquierda.

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

Añadir al principio y al final

Puedes añadir tanto al principio como al final de un bit array existente usando la sintaxis de bit array. Para el bit array existente hay que usar la anotación :bits.

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

Concatenación

Podemos concatenar bit arrays guardados en variables usando la sintaxis. Hay que usar la anotación :bits cuando se concatenan dos bit arrays de tamaños variables.

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

Coincidencia de patrones

También se puede hacer coincidencia de patrones para obtener valores del bit array. Tienes que saber el número de bits de cada fragmento que quieras capturar, con una excepción: la anotación :bits se puede usar para hacer coincidencia de patrones con un bit array de tamaño desconocido, pero solo se puede usar en el último fragmento.

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

Inspeccionar bit arrays

Note

Puede que los bit arrays se impriman en un formato distinto del que se usó para crearlos. Esto suele causar confusión cuando se aprenden los bit arrays.

Por defecto, los bit arrays se muestran en fragmentos de 8 bits (un byte), incluso si los creaste con fragmentos de otro tamaño.

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

Si creas un bit array que representa un string codificado en UTF-8 que se puede imprimir, es posible que se muestre como un string si usas echo keyword cuando el objetivo es Erlang. Esto se debe a un detalle de implementación de cómo Gleam representa los strings internamente.

<<>>
// -> ""

<<65, 66, 67>>
// -> "ABC"
Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Arrays de bits