Erlang Bit语法:它如何知道它是3个组件?

ber*_*zie 1 erlang bit-manipulation

我一直在读关于Erlang的书,以评估它是否适合我的项目,并且结合了" 学习你的一些Erlang for Great Book"的位语法部分.

简单地说,这是代码:

1> Color = 16#F09A29.
15768105
2> Pixel = <<Color:24>>.
<<240,154,41>>
Run Code Online (Sandbox Code Playgroud)

令我困惑的是:Color变量是24位,但Erlang怎么知道它必须将变量(第2行)分成三段?该规则如何阅读?

我试着阅读本章的其余部分,但它越来越让我感到困惑,因为我不明白它如何划分数字.你能解释一下bit语法是如何工作的吗?怎么知道它是3段,<<154, 41>>当我这样做时它怎么会变成:

1> Color = 16#F09A29.
15768105
2> Pixel = <<Color:16>>.
<<154,41>>
Run Code Online (Sandbox Code Playgroud)

谢谢你.

Pas*_*cal 7

Color = 16#F09A29是一个整数,可以用十进制表示形式写成15768105,以及

00000000111100001001101000101001

在二进制表示中.

当您定义二进制Pixel = << Color:24 >>时.它只是意味着你说"匹配24个不太重要的颜色与二进制像素".所以Pixel有限

111100001001101000101001,

没有任何分裂! 当shell打印出来时,它以十进制表示形式执行每字节字节,即:

11110000 = 15*16 = 240,10011010 = 9*16 + 10 = 154,001001001 = 2*16 + 9 = 41 => << 240,154,41 >>

以同样的方式,当您定义Pixel = << Color:16 >>时,它只需要16个较低有效位并将它们分配给二进制=

1001101000101001,

打印10011010 =

9*16 + 10 = 154,001001001 = 2*16 + 9 = 41 => << 154,41 >>.

在<>的情况下,二进制现在等于

100001001101000101001

(21个不太重要的位)当shell打印它们时,它像往常一样启动,将二进制分成字节

10000100 = 8*16 + 4 = 132,11010001 = 13*16 +1 = 209,因为它只保留5位01001,最后一个数据块打印为5:9告诉我们最后一个值的大小不是8位=通常为1字节,但只有5位=>

<< 132,209,5:9 >>.

二进制文件的优点在于,您可以使用大小规范对其进行"解码"(可能下面的示例更清楚).

(exec@WXFRB1824L)43> Co=16#F09A29.
15768105
(exec@WXFRB1824L)44> Pi = <<Co:24>>.
<<240,154,41>>
(exec@WXFRB1824L)45> <<R:8,V:8,B:8>> = Pi.
<<240,154,41>>
(exec@WXFRB1824L)46> R.
240
Run Code Online (Sandbox Code Playgroud)