Elixir 中 BitString 的位计数或汉明权重?
Bit-Count or Hamming-weight of a BitString in Elixir?
请问我们如何efficiently
计算 elixir 中位串的汉明权重?
示例:0b0101101001
的汉明权重为 5(即设置了 5 位)
我的尝试:
iex> Enum.count(Integer.to_char_list(n,2),&(&1===49))
这是一个性能更好的解决方案,它(对我而言)也更清楚地表明了意图:
for(<<bit::1 <- :binary.encode_unsigned(n)>>, do: bit) |> Enum.sum
使用具有 100.000 个二进制数字的 benchfella 进行基准测试:
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
基准测试结果:
$ 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
请问我们如何efficiently
计算 elixir 中位串的汉明权重?
示例:0b0101101001
的汉明权重为 5(即设置了 5 位)
我的尝试:
iex> Enum.count(Integer.to_char_list(n,2),&(&1===49))
这是一个性能更好的解决方案,它(对我而言)也更清楚地表明了意图:
for(<<bit::1 <- :binary.encode_unsigned(n)>>, do: bit) |> Enum.sum
使用具有 100.000 个二进制数字的 benchfella 进行基准测试:
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
基准测试结果:
$ 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