#!/usr/bin/perl -w use strict; my $mant; BEGIN { my $max= 2; $max *= 2 until 2*$max+1 == 2*$max; $mant= pack("d",$max) ^ pack("d",2*$max-1); } sub prevPower2 { my( $n )= @_; return unpack "d", ~$mant & pack "d", $n; } sub nextPower2 { my( $n )= @_; my $p= prevPower2( $n ); $p *= 2 if $p != $n; return $p; } while( <> ) { chomp; my $dir= (qw( < = > ))[ 1 + (0<=>$_) ]; print prevPower2($_), " $dir= $_ $dir= ", nextPower2($_), $/; }