首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >药方中BitString的比特数或汉明重量?

药方中BitString的比特数或汉明重量?
EN

Stack Overflow用户
提问于 2015-12-02 17:42:31
回答 2查看 653关注 0票数 6

请问efficiently如何计算灵丹妙药中一根串的汉明重量?

例如:0b0101101001的汉明重量为5(即5位)。

我的尝试:

代码语言:javascript
复制
iex> Enum.count(Integer.to_char_list(n,2),&(&1===49)) 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-02 18:54:57

这里有一个更好的解决方案,它(对我来说)也更清楚地显示了它的意图:

代码语言:javascript
复制
for(<<bit::1 <- :binary.encode_unsigned(n)>>, do: bit) |> Enum.sum

使用具有100.000位二进制数的基准测试:

代码语言:javascript
复制
Benchfella.start

defmodule HammingBench do
  use Benchfella

  @n Stream.repeatedly(fn -> Enum.random [0, 1] end)
    |> Enum.take(100_000)
    |> Enum.join
    |> String.to_integer(2)

  bench "CharlesO" do
    Enum.count(Integer.to_char_list(@n,2),&(&1===49)) 
  end

  bench "Patrick Oscity" do
    for(<<bit::1 <- :binary.encode_unsigned(@n)>>, do: bit) |> Enum.sum
  end
end

基准结果:

代码语言:javascript
复制
$ mix bench
Compiled lib/hamming_bench.ex
Generated hamming_bench app
Settings:
  duration:      1.0 s

## HammingBench
[20:12:03] 1/2: Patrick Oscity
[20:12:06] 2/2: CharlesO

Finished in 8.4 seconds

## HammingBench
Patrick Oscity         500   4325.79 µs/op
CharlesO                 1   5754094.00 µs/op
票数 8
EN

Stack Overflow用户

发布于 2022-06-26 08:16:03

虽然Patrick的答案对于正整数是正确的,但对于负数,它将失败,因为:binary.encode_unsigned/1不处理它们。

使用<<>>

相反,我建议使用Elixir的强大的<<>>位字符串运算符(它看起来更好看):

代码语言:javascript
复制
Enum.sum(for << bit::1 <- <<n>> >>, do: bit))

还可以将整数大小指定为16位、32位或其他任何内容:

代码语言:javascript
复制
<<n::integer-32>>

在一次传递中计数位

作为另一种方法,您还可以一次直接计数位数,而不是先获取所有比特,然后再对它们进行求和:

代码语言:javascript
复制
defmodule HammingWeight do
  def weight(int) when is_integer(int) do
    w(<<int>>, 0)
  end

  defp w(<<>>>, count),                do: count
  defp w(<<0::1, rest::bits>>, count), do: w(rest, count)
  defp w(<<1::1, rest::bits>>, count), do: w(rest, count + 1)
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34049445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档