【问题标题】:Convert base 2 number in a binary to an Erlang integer将二进制中的以 2 为底的数字转换为 Erlang 整数
【发布时间】:2017-03-13 02:10:57
【问题描述】:

假设我有一个像这样用二进制表示法表示的数字:

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

这是数字 7 的二进制表示法,在 shell 中评估它甚至会产生 7:

<<7>>

如何将此二进制转换为 Erlang 整数?我可以将二进制文件转换为列表,并获取其中的单个整数值,但这不适用于需要多个字节的大数字,因为列表将包含二进制文件中每个字节的项目。

【问题讨论】:

  • 要解决约瑟夫斯问题,您无需明确写出位。只需计算高位,减去它,乘以 2 并加 1:(N - (1 bsl erlang:trunc(math:log(N)/math:log(2)))) * 2 + 1。

标签: binary numbers erlang base


【解决方案1】:

使用模式匹配:

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。来自the section on Bit Syntax Expressions of the Erlang Reference Manual

用于位串构造,Size 是一个计算为整数的表达式。

用于位串匹配,Size必须是整数,或者是绑定整数的变量。

【讨论】:

    【解决方案2】:

    如果您知道只有二进制文件而不是位串,即字节数是 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
    

    【讨论】:

      【解决方案3】:

      一种方法是使用二进制推导通过添加$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。

      【讨论】:

        猜你喜欢
        • 2011-04-29
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 2012-04-10
        • 2012-02-27
        • 1970-01-01
        • 2017-07-13
        相关资源
        最近更新 更多