我正在阅读二元运算符的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>>
答案 0 :(得分:8)
<<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