Four bit adder: Difference between revisions

Added Elixir
m (→‎{{header|Sidef}}: replaced "each" with "for" loop)
(Added Elixir)
Line 748:
 
</lang>
 
=={{header|Clojure}}==
<lang clojure>
Line 1,094 ⟶ 1,095:
vzeroupper
ret $160</lang>
 
=={{header|Elixir}}==
{{works with|Elixir|1.1}}
{{trans|Ruby}}
<lang elixir>defmodule RC do
use Bitwise
@bit_size 4
def four_bit_adder(a, b) do # returns pair {sum, carry}
a_bits = binary_string_to_bits(a)
b_bits = binary_string_to_bits(b)
Enum.zip(a_bits, b_bits)
|> List.foldr({[], 0}, fn {a_bit, b_bit}, {acc, carry} ->
{s, c} = full_adder(a_bit, b_bit, carry)
{[s | acc], c}
end)
end
defp full_adder(a, b, c0) do
{s, c} = half_adder(c0, a)
{s, c1} = half_adder(s, b)
{s, bor(c, c1)} # returns pair {sum, carry}
end
defp half_adder(a, b) do
{bxor(a, b), band(a, b)} # returns pair {sum, carry}
end
def int_to_binary_string(n) do
Integer.to_string(n,2) |> String.rjust(@bit_size, ?0)
end
defp binary_string_to_bits(s) do
String.codepoints(s) |> Enum.map(fn bit -> String.to_integer(bit) end)
end
def task do
IO.puts " A B A B C S sum"
Enum.each(0..15, fn a ->
bin_a = int_to_binary_string(a)
Enum.each(0..15, fn b ->
bin_b = int_to_binary_string(b)
{sum, carry} = four_bit_adder(bin_a, bin_b)
:io.format "~2w + ~2w = ~s + ~s = ~w ~s = ~2w~n",
[a, b, bin_a, bin_b, carry, Enum.join(sum), Integer.undigits([carry | sum], 2)]
end)
end)
end
end
 
RC.task</lang>
 
{{out}}
<pre>
A B A B C S sum
0 + 0 = 0000 + 0000 = 0 0000 = 0
0 + 1 = 0000 + 0001 = 0 0001 = 1
0 + 2 = 0000 + 0010 = 0 0010 = 2
0 + 3 = 0000 + 0011 = 0 0011 = 3
0 + 4 = 0000 + 0100 = 0 0100 = 4
...
7 + 13 = 0111 + 1101 = 1 0100 = 20
7 + 14 = 0111 + 1110 = 1 0101 = 21
7 + 15 = 0111 + 1111 = 1 0110 = 22
8 + 0 = 1000 + 0000 = 0 1000 = 8
8 + 1 = 1000 + 0001 = 0 1001 = 9
8 + 2 = 1000 + 0010 = 0 1010 = 10
...
15 + 12 = 1111 + 1100 = 1 1011 = 27
15 + 13 = 1111 + 1101 = 1 1100 = 28
15 + 14 = 1111 + 1110 = 1 1101 = 29
15 + 15 = 1111 + 1111 = 1 1110 = 30
</pre>
 
=={{header|Erlang}}==
Anonymous user