Binary 将二进制中的基数2转换为Erlang整数
假设我有一个像这样的数字,用这样的二进制表示法表示:Binary 将二进制中的基数2转换为Erlang整数,binary,numbers,erlang,base,Binary,Numbers,Erlang,Base,假设我有一个像这样的数字,用这样的二进制表示法表示: <<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>> 这是数字7的二进制表示法,在shell中计算它甚至可以得到7: <<7>> 如何将此二进制文件转换为Erlang整数?我可以将二进制文件转换为一个列表,并获取其中的单个整数值,但这不适用于需要多个字节的大数字,因为该列表将包含二进制文件中每个字节的一项。使用模式匹配: Bin = <<0
<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>
这是数字7的二进制表示法,在shell中计算它甚至可以得到7:
<<7>>
如何将此二进制文件转换为Erlang整数?我可以将二进制文件转换为一个列表,并获取其中的单个整数值,但这不适用于需要多个字节的大数字,因为该列表将包含二进制文件中每个字节的一项。使用模式匹配:
Bin = <<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>,
Size = bit_size(Bin),
<<X:Size>> = Bin.
Bin=,
尺寸=位尺寸(Bin),
=垃圾箱。
之后,变量X
包含整数7。无论二进制文件包含多少位,这都有效
如果您想知道,实际上有必要在匹配之前将位大小绑定到变量
size
。发件人:
在位字符串构造中使用,Size是要计算为整数的表达式
在位字符串匹配中使用,大小必须是整数或绑定到整数的变量
一种方法是使用二进制理解,通过添加
$0
,将每个位单独转换为其等效字符,然后将生成的二进制文件传递给转换,将其数字基数指定为2:
1> binary_to_integer(<< <<(X+$0)>> || <<X:1>> <= <<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>> >>, 2).
7
2> binary_to_integer(<< <<(X+$0)>> || <<X:1>> <= <<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1, 0:4, 1:1, 0:1, 1:1, 0:1>> >>, 2).
1802
1>二进制到整数(,2)。
7.
2> 二进制_到_整数(,2)。
1802
第二个示例显示了一个较长的二进制文件,该文件的值为十六进制
16#70A
,或二进制2#11100001010
,两者都相当于十进制值1802。如果您知道只有二进制文件而没有位字符串,即字节数将是8的倍数,您可以使用二进制:解码\u unsigned/1
:
1> binary:decode_unsigned(<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>).
7
2> binary:decode_unsigned(<<1:8, 0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>).
263
3> binary:decode_unsigned(<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1, 0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>).
1799
1>二进制:解码\u unsigned()。
7.
2> 二进制:解码_unsigned()。
263
3> 二进制:解码_unsigned()。
1799
要解决Josephus问题,无需显式写出位。只需计算高位,减去它,乘以2,再加上1:(N-(1 bsl erlang:trunc(math:log(N)/math:log(2))*2+1。