32 lines
775 B
Plaintext
32 lines
775 B
Plaintext
func bxor(a, b) {
|
|
(~a & b) | (a & ~b)
|
|
}
|
|
|
|
func half_adder(a, b) {
|
|
return (bxor(a, b), a & b)
|
|
}
|
|
|
|
func full_adder(a, b, c) {
|
|
var (s1, c1) = half_adder(a, c)
|
|
var (s2, c2) = half_adder(s1, b)
|
|
return (s2, c1 | c2)
|
|
}
|
|
|
|
func four_bit_adder(a, b) {
|
|
var (s0, c0) = full_adder(a[0], b[0], 0)
|
|
var (s1, c1) = full_adder(a[1], b[1], c0)
|
|
var (s2, c2) = full_adder(a[2], b[2], c1)
|
|
var (s3, c3) = full_adder(a[3], b[3], c2)
|
|
return ([s3,s2,s1,s0].join, c3.to_s)
|
|
}
|
|
|
|
say " A B A B C S sum"
|
|
for a in ^16 {
|
|
for b in ^16 {
|
|
var(abin, bbin) = [a,b].map{|n| "%04b"%n->chars.reverse.map{.to_i} }...
|
|
var(s, c) = four_bit_adder(abin, bbin)
|
|
printf("%2d + %2d = %s + %s = %s %s = %2d\n",
|
|
a, b, abin.join, bbin.join, c, s, "#{c}#{s}".bin)
|
|
}
|
|
}
|