作者:清潇静凌 | 来源:互联网 | 2023-01-23 23:43
我正在阅读二元运算符的elixir doc:https://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#binaries-and-bitstrings
在doc中:
iex> <<255>>
<<255>>
iex> <<256>> # truncated
<<0>>
iex> <<256 :: size(16)>> # use 16 bits (2 bytes) to store the number
<<1, 0>>
默认值为8位elixir二进制,如果超过8位,结果将截断为0.
但为什么<<256 :: size(16)>>
要出席<<1, 0>>
?我认为应该是<<1, 255>>
1> Dogbert..:
<<1, 0>>
是正确的.二进制256是0b100000000
.
iex(1)> 0b100000000
256
当你将它扩展到16位时,你会得到0b0000000100000000
.
iex(2)> 0b0000000100000000
256
当你以big-endian字节顺序将它分成两个字节时,你会得到0b00000001
和0b00000000
,这是1
和0
.
iex(3)> <<256::size(16)>>
<<1, 0>>
在little-endian字节顺序中,你将得到0
并且1
随着字节的顺序颠倒:
iex(4)> <<256::little-size(16)>>
<<0, 1>>
要从big-endian字节返回原始数字,你可以想到它将最后一个数字乘以1,将第二个数字乘以256,将第三个数字乘以256*256,依此类推,然后对它们进行求和.
iex(5)> <<256::size(16)>>
<<1, 0>>
iex(6)> 1 * 256 + 0 * 1
256
iex(7)> <<123456::size(24)>>
<<1, 226, 64>>
iex(8)> 1 * 256 * 256 + 226 * 256 + 64 * 1
123456