On Sat, Apr 10, 2010 at 04:02:05PM -0400, Adam D. Ruppe wrote:
> That breaks it. Back to the drawing board.

I *might* have it, but I'm not 100% confident in my test program. Here's my
implementation:

====
import std.intrinsic;

uint max(uint a, uint b) { return (a >= b) ? a : b; }
uint min(uint a, uint b) { return (a >= b) ? b : a; }
uint numbits(uint a) { return a == 0 ? a : (bsr(a) + 1); }

uint max_c(uint a, uint b) {
        uint mn = min(a, b);
        uint mx = max(a, b);
        if(mn == 0)
                return mx;
        // if there is a bit we can reuse, it grants us everything before it too
        uint reusable = mn & mx;
        if(reusable)
                return (mx | ((1 << numbits(reusable)) - 1)) | mn;
        else
                return mx | mn;
}

uint min_c(uint min_a, uint min_b) {
        return max(min_a, min_b);
}
=====

I can't believe I spent all day on this...

-- 
Adam D. Ruppe
http://arsdnet.net

Reply via email to