RosettaCodeData/Task/Four-bit-adder/Julia/four-bit-adder-1.julia
2020-02-17 23:21:07 -08:00

30 lines
724 B
Text

using Printf
xor{T<:Bool}(a::T, b::T) = (a&~b)|(~a&b)
halfadder{T<:Bool}(a::T, b::T) = (xor(a,b), a&b)
function fulladder{T<:Bool}(a::T, b::T, c::T=false)
(s, ca) = halfadder(c, a)
(s, cb) = halfadder(s, b)
(s, ca|cb)
end
function adder(a::BitArray{1}, b::BitArray{1}, c0::Bool=false)
len = length(a)
length(b) == len || error("Addend width mismatch.")
c = c0
s = falses(len)
for i in 1:len
(s[i], c) = fulladder(a[i], b[i], c)
end
(s, c)
end
function adder{T<:Integer}(m::T, n::T, wid::T=4, c0::Bool=false)
a = bitpack(digits(m, 2, wid))[1:wid]
b = bitpack(digits(n, 2, wid))[1:wid]
adder(a, b, c0)
end
Base.bits(n::BitArray{1}) = join(reverse(int(n)), "")