Hacker News new | ask | show | jobs
by tzs 5071 days ago
This can be fixed by keeping track of some of the spillage. Here's a solution using this approach that works for 32-bit unsigned integers:

    def badd(A, C):
        while C != 0:
            t = A & C
            A = A ^ C
            C = (t << 1) & 0xFFFFFFFF
        return A

    def div3(ah):
        qh = 0
        ql = 0
        al = 0
        while ah != 0:
            al = (al >> 2) & 0x0000FFFF
            al = badd(al, (ah & 0x3) << 14)
            ah = ah >> 2
            qh = badd(qh, ah)
            ql = badd(ql, al)
            if ql & 0xFFFF0000:
                qh = badd(qh, ql >> 16)
                ql = ql & 0xFFFF
        if ql > 0x8000:
            qh = badd(qh, 1)
        return qh