#!/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($/); } ) { 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