value range propagation for _bitwise_ OR

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Fri Apr 16 22:55:26 PDT 2010


On 04/16/2010 11:43 PM, Steven Schveighoffer wrote:
> Andrei Alexandrescu Wrote:
>
>> Looks great, thanks Jerome!
>>
>> Now, how about that case in which some or all of the ranges
>> involved include negative values?
>
> I solved already signed values in terms of any valid unsigned
> solution, see here:
> http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=108869
>
>  The maxor with all the unsigned casts is the call to the unsigned
> maxor.  Ditto for minor.
>
> Also, see my one liner for unsigned maxor:
>
> http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=108916
>
>  All that is left is to find a quick (possibly one liner?) minor for
> unsigned.  Maybe there's a quicker signed solution, but the
> complexity is already O(1) * complexity of unsigned.
>
> Also, someone pointed out that Jerome's highbit is equivalent to the
> x86 bsr instruction (std.instrinsic.bsr).

That looks good. I'm thinking of expressing minOR for unsigned in terms 
of maxOR for one's complement.

We have min_a <= a <= max_a. This implies ~max_a <= ~a <= ~min_a.

Wavehanding follows.

We're looking for the numbers a and b that minimize the number of bits 
in a|b. Those choices for a and b would then maximize the number of bits 
in ~a|~b. So:

minOR == maxOR(~max_a, ~min_a, ~max_b, ~min_b)

Works?


Andrei



More information about the Digitalmars-d mailing list