Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary 将二进制中的基数2转换为Erlang整数_Binary_Numbers_Erlang_Base - Fatal编程技术网

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。