Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: Power of two round up.

by I0 (Priest)
on Dec 15, 2000 at 23:41 UTC ( #46899=note: print w/replies, xml ) Need Help??


in reply to Power of two round up.

local $_ = (shift)-1; $_ |= $_>>1; $_ |= $_>>2; $_ |= $_>>4; $_ |= $_>>8; $_ |= $_>>16; return ++$_

Replies are listed 'Best First'.
Re: Power of two round up.
by Dominus (Parson) on Dec 16, 2000 at 22:24 UTC
    I'm amazed at how clever this is, and I'm going to use it in my program. Thanks a lot.

      Although it's a technique more appropriate in a C program. In Perl, log($_)/log(2) benchmarks faster. (assuming it rounds properly at the boundaries)
      Update: My earlier timethese qq{} may have been misleading. With timethese sub{} the | >> method comes out faster
        Sure, because it has to dispatch many fewer opcodes. But if I had wanted to use the log2 x solution, I wouldn't have asked in the first place. Floating-point arithmetic gives me the heebie-jeebies.

Re: Re: Power of two round up.
by runrig (Abbot) on Dec 18, 2000 at 21:28 UTC
    Just to give Dominus more heebie jeebies :)
    sub round_up { local $_ = (shift)-1; my $num = (2**int(log($_)/log(2)))-1; return ++($_ |= $num); }
Re: Re: Power of two round up.
by jynx (Priest) on Dec 20, 2000 at 06:12 UTC
    On the other hand,

    If you want to use horrible and/or (somewhat) obfuscated code, you could try:

    sub shifty { my $v = (shift)-1; map { return ++$v } map { $v |= $v >> $_ } (1,2,4,8,16); }
    or alternately (the readable version):
    sub shifty2 { my $v = (shift)-1; $v |= $v >> $_ foreach (1,2,4,8,16); return ++$v; }
    i don't know why i was compelled to post that, but i knew one could reduce the repition and possibly obfuscate the code a little with some obviously useless uses of map doing things it wasn't meant to do...
    my $0.02;

    jynx

      #or perhaps $w=32; $v |= $v>>($w>>=1) while $w;

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://46899]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (4)
As of 2016-10-01 20:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    How many different varieties (color, size, etc) of socks do you have in your sock drawer?






    Results (7 votes). Check out past polls.