Erlang 中的位语法和二进制表示

Bit Syntax and Binary Representation in Erlang

我正在努力了解 Erlang 中的位语法,但在理解其工作原理时遇到了一些问题:

Red = 10.
Green = 61.
Blue = 20.
Color = << Red:5, Green:6, Blue:5 >> .

我在 Joe Armstrong 的 Software for a concurrent world 第二版中看到了这个例子,这段代码将

create a 16 bit memory area containing a single RGB triplet.

我的问题是16位的内存区怎么能装3个字节呢?。我对位移位一无所知,也找不到与此主题相关的任何内容,也提到了 erlang。到目前为止我的理解是该段由 16 个部分组成,红色占据 5 个,绿色 6 个和蓝色 5 个,但是我知道这是怎么可能的。

鉴于

61 = 0011011000110001 

哪一个是 16 位的,这个封装怎么可能?

首先,如果将 61 存储为两个 ASCII 数字,则 61 仅等于 00110110 00110001。 61用二进制写成111101.

请注意,二进制表示需要六个二进制数字,或简称为六个 "bits"。这就是我们在这一行中所利用的:

Color = << Red:5, Green:6, Blue:5 >> .

我们为红色值使用 5 位,为绿色值使用 6 位,为蓝色值使用 5 位,总共 16 位。这是有效的,因为红色值和蓝色值都小于 32(因为 31 是可以用 5 位表示的最大数字),而绿色值小于 64(因为 63 是可以表示的最大数字) 6 位)。

完整的值是01010 111101 10100(红绿蓝三段),或者如果我们把它分成两个字节,01010111 10110100.