value range propagation for _bitwise_ OR

Steven Schveighoffer schveiguy at yahoo.com
Mon Apr 12 04:50:29 PDT 2010


On Sun, 11 Apr 2010 00:30:07 -0400, Steven Schveighoffer  
<schveiguy at yahoo.com> wrote:

> Signed is probably trickier, suppose one is always negative and one is  
> always positive!

Turns out signed is really easy once you have unsigned solved.

Here is minor and maxor for signed assuming unsigned is solved:

int maxor(int mina, int maxa, int minb, int maxb)
{
     if(mina < 0 && maxa >= 0)
     {
         int result = maxor(0, maxa, minb, maxb);
         return result > -1 ? result : -1;
     }
     if(minb < 0 && maxb >= 0)
     {
         int result = maxor(mina, maxa, 0, maxb);
         return result > -1 ? result : -1;
     }
     return cast(int)maxor(cast(uint)mina, cast(uint)maxa, cast(uint)minb,  
cast(uint)maxb);
}

int minor(int mina, int maxa, int minb, int maxb)
{
     if(mina < 0 && maxa >= 0)
     {
         int result = minor(mina, -1, minb, maxb);
         return result < minb ? result : minb;
     }
     if(minb < 0 && maxb >= 0)
     {
         int result = minor(mina, maxa, minb, -1);
         return result < mina ? result : mina;
     }
     return cast(int)minor(cast(uint)mina, cast(uint)maxa, cast(uint)minb,  
cast(uint)maxb);
}

The trick is to avoid dealing with a range that crosses the 0 boundary.   
The negative range isn't any different than an unsigned range -- set the  
most possible bits for max, unset the most possible bits for min.  The  
sign bit simply becomes a hard-wired bit.

BTW, I release this code into the public domain, use it for any purpose  
you wish.

-Steve



More information about the Digitalmars-d mailing list