1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
defmodule Conv do
def bin_to_hex(b) do
bin_to_hex_rec(b, [])
end
defp bin_to_hex_rec(before, aft) when before != "" do
{b, a} = String.split_at(before, -4)
s = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]
bin_to_hex_rec(b, [Enum.at(s, bin_to_dec(a)) | aft])
end
defp bin_to_hex_rec("", aft) do
aft
end
def bin_to_dec(b) do
bin_to_dec_rec(b, 0, 0)
end
defp bin_to_dec_rec(before, aft, i) when before != "" do
{b, a} = String.split_at(before, -1)
bin_to_dec_rec(b, case a do
"0" -> aft
"1" -> aft + Integer.pow(2, i)
end, i + 1)
end
defp bin_to_dec_rec("", aft, _i) do
aft
end
end
Conv.bin_to_hex("1111")
|> IO.puts() # must print f
Conv.bin_to_hex("11101011")
|> IO.puts() # must print EB
|