Hypothesis:
Each AND/OR operation is evaluated in the following way:
( <left_gained_avg_bits_set> <op> <right_modifier> ) = <resulting_avg_bits_set>
Whenever an AND/OR
<op> is applied, it induces a change to the already gained average bits on the left-side. That change is a multiplicative factor determined by the average bits set on the right-side:
right_mod_factor = right_avg_set_bits / total_bits
Cases:
For
<op> = AND, we would take
right_mod_factor and multiply it with
left_avg_bits_set to get
<resulting_avg_bits_set>. Examples:
R & (R & R) => 16 * (8 / 32) = 4 bits set on average
(R | R) & (R & R & R) => 24 * (4 / 32) = 3 bits set on average
That is, if there are more bits set on average on the AND right-side, there will be less chance of
swallowing, so more bits are set on average in the result.
Conversely, for
<op> = OR, we would take
right_mod_factor and multiply it with
left_avg_unset_bits. Then, take that result and add it to
left_avg_set_bits to get
<resulting_avg_bits_set>. Examples:
R | (R | R) => 16 + 16 * (24 / 32) = 28 bits set on average [second 16 is # of avg unset bits]
(R | R) | (R & R & R) => 24 + 8 * (4 / 32) = 25 bits set on average
R & R & R | R | R = (R & R & R) | (R | R) => 4 + 28 * (24 / 32) = 25 bits set on average
or
R & R & R | R | R = (R & R & R) | R | R => 4 + 28 * (16 / 32) + 14 * (16 / 32) = 25 bits set on average [got 14 from 32 - ( 4 + 28 * (16 / 32) )]
That is, if there are more bits set on average on the OR right-side, there will be more chance of
overriding, so more bits are set on average in the result.
Conclusion:
So, following my pattern hypothesis, I see some inconsistent results in your "full set".
For instance, 7 of ( R & R | R & R ) & R evaluates to 5 bits set on average. Attention has to be paid to precedence of AND/OR evaluations. Also, 22 & 26 are the same, when 22 of
R & R | R | R evaluates to 26 bits set on average.
There may be some fallacy in my hypothesis, so feedback is welcomed :)
we can derive a set of equations to calculate the resulting average bits set for each AND/OR operation: