将二进制中的基数为2的数字转换为Erlang整数

3

假设我有一个数字,用二进制表示如下:

<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>

这是数字7的二进制表示法,在shell中计算结果也是7:

<<7>>

我该如何将这个二进制转换为 Erlang 整数?我可以将二进制转换为列表,并获取其中的单个整数值,但对于需要多个字节的大数来说,这种方法就不起作用了,因为列表将包含二进制中每个字节的一个项。


为了解决约瑟夫问题,您无需显式地编写位。只需计算高位,减去它,乘以二并加一:(N - (1 bsl erlang:trunc(math:log(N)/math:log(2)))) * 2 + 1。 - RichardC
3个回答

6

使用模式匹配:

Bin = <<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>,
Size = bit_size(Bin),
<<X:Size>> = Bin.

接下来,变量X包含整数7。这适用于二进制包含的位数。


如果你想知道,在匹配之前将位大小绑定到变量Size是必要的。从Erlang参考手册的位语法表达式章节中可以看到:

在位字符串构造中使用时,Size是一个将评估为整数的表达式。

在位字符串匹配中使用时,Size必须是一个整数或绑定到整数的变量。


3

如果您知道只有二进制而不是位串,即字节数量将是8的倍数,您可以使用binary:decode_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
一种方法是使用二进制推导式,通过添加$0将每个位单独转换为其字符等效项,然后将结果二进制传递给binary_to_integer/2进行转换,指定其数字基数为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

第二个示例展示了一个更长的二进制数,它表示十六进制值16#70A或二进制值2#11100001010,两者都等于十进制值1802。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接