in reply to Next/Prev power of 2


That's very nice. ++

Here is a less elegant, and slower, solution that uses some of the POSIX functions:

#!/usr/bin/perl -wl use strict; use POSIX qw(frexp ldexp); sub prev_power2 { return 0 if $_[0] == 0; my $num = $_[0]; my ($mant, $exp) = frexp($num); my $sign = $mant < 0 ? -1 : 1; return ldexp(0.5 *$sign, $exp); } sub next_power2 { my $num = $_[0]; my $prev = prev_power2($num); my $next = $prev; $next = $prev *2 if $prev != $num; return $next; }

The following seems to be faster than both of the above. It doesn't handle numbers less than 1 but that could be fixed.

sub prev_power2 { return 2 ** int log($_[0]) / log 2; }

Finally, how not to do it: Power Twool

--
John.