One lunch I was complaining about how
or and
die get all of the good work and some of my
bit-twiddling coworkers said that they hardly ever have
anything to do. We went out for drinks later and they
tried to teach me what they know about integers. I find
it very hard to understand but I think I figured out how
to do 2+2.
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";