value range propagation for _bitwise_ OR
Ali Çehreli
acehreli at yahoo.com
Sun Apr 11 10:16:09 PDT 2010
Rainer Deyke wrote:
> How about this?
>
> uint fill_bits(uint min_v, uint max_v) {
> uint mask = 0;
> for (int i = 0; i < 32; ++i) {
> if ((min_v | (1 << i)) <= max_v) mask |= (1 << i);
> }
> return mask;
> }
>
> max_c = min(
> max_a | fill_bits(min_b, max_b),
> max_b | fill_bits(min_a, max_a));
>
>
That proposal looks at the two pairs of a and b separately. For example,
works with min_a and max_a, and decides a bit pattern.
What if the allowable bit pattern for the b pair has 0 bits that would
be filled with an value of a that was missed by fill_bits for a? Imagine
a value of a, that has little number of 1 bits, but one of those bits
happen to be the one that fills the hole in b...
This problem has nothing directly to do with values, it has something to
do with parts of values. The parts of values cannot be decided by
looking at only a pair.
Here are some values that the algorithm fails with ("mask" is printed
before returning from fill_bits) :
binary decimal
-----------------------------------
mask 0000000011 3
mask 0111111111 511
min_a 0000100100 36
max_a 0101100011 355
min_b 0000000001 1
max_b 0000000100 4
calculated 0101100011 355
WRONG! empirical 0101100111 359
emp_max_a 0101100011 355
emp_max_b 0000000100 4
The last two lines are telling: An unsuspected value of b happens to be
the one that produces the maximum value of a|b.
Ali
More information about the Digitalmars-d
mailing list