sub add { my( $a, $b, $bit, $cary, $sum ) = ( @{$_[0]}, 1, 0, 0 ); $sum |= $bit if 1 & ( $a ^ $b ^ $cary ); $cary = 1 & ( $a & $b | ( $cary & ($a|$b) ) ); return $a | $b ? [$a>>1,$b>>1,$bit<<1,$cary,$sum] : $sum; } my @args = map {0+$_} (@ARGV,2,2)[0,1]; my $acc = add( [@args] ); $acc = add($acc) while ref $acc; print "add[@args] = $acc\n";