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
.
我正在努力了解 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
.