Well, if you could portably ask whether the mantissa of the number was represented with all 0 bits (since the leading 1 bit is implied and so doesn't appear)...
#!/usr/bin/perl -w
use strict;
my $mask;
BEGIN {
my $max= 2;
$max *= 2 until 2*$max+1 == 2*$max;
$mask= pack("d",$max) ^ pack("d",2*$max-1);
}
sub power2 {
my( $n )= @_;
return if ! $n;
return( ( $mask & pack "d", $n ) !~ /[^\0]/ );
}
for( split " ", do { local($/); <DATA> } ) {
print "$_: ", power2($_)?1:0, "\n";
}
__END__
0 1 2 3 4 5 6 7 8 9 0.5 0.2 0.25 0.125 -1 -2 -3 -.25
produces
0: 0
1: 1
2: 1
3: 0
4: 1
5: 0
6: 0
7: 0
8: 1
9: 0
0.5: 1
0.2: 0
0.25: 1
0.125: 1
-1: 1
-2: 1
-3: 0
-.25: 1
which has the advantage of catching negative-powers of 2 and negative powers-of-2. (:
-
tye
(but my friends call me "Tye") |