我试图了解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位这个包装怎么可能?
答案 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
。