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

时间:2015-01-05 16:19:15

标签: erlang byte bit bit-shift

我试图了解Erlang中的Bit语法并且我在理解其工作原理时遇到了一些麻烦:

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

我已经在Joe Armstrong第二版的软件中看到了这个例子,并且这段代码

  

创建一个包含单个RGB三元组的16位存储区。

我的问题是如何在16位存储区中打包3个字节?我对比特移位并不熟悉,而且我也无法找到与这个主题相关的任何东西。到目前为止,我的理解是该段由16个部分组成,红色占5个,绿色6和蓝色5但是我要注意这是否可能。

鉴于此

61 = 0011011000110001 

单独是16位这个包装怎么可能?

1 个答案:

答案 0 :(得分:1)

首先,如果将它存储为两个ASCII数字,则61仅等于00110110 00110001。以二进制编写时,61为111101

请注意,二进制表示需要六个二进制数字,或简称为六个“位”。这就是我们在这一方面所利用的:

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

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

完整值为01010 111101 10100(红色,绿色和蓝色的三个段),或者如果我们将其拆分为两个字节01010111 10110100