Average of 3 long integers

前端 未结 12 1743
我寻月下人不归
我寻月下人不归 2020-12-07 10:05

I have 3 very large signed integers.

long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;

I want to calculate th

12条回答
  •  猫巷女王i
    2020-12-07 11:05

    This function computes the result in two divisions. It should generalize nicely to other divisors and word sizes.

    It works by computing the double-word addition result, then working out the division.

    Int64 average(Int64 a, Int64 b, Int64 c) {
        // constants: 0x10000000000000000 div/mod 3
        const Int64 hdiv3 = UInt64(-3) / 3 + 1;
        const Int64 hmod3 = UInt64(-3) % 3;
    
        // compute the signed double-word addition result in hi:lo
        UInt64 lo = a; Int64 hi = a>=0 ? 0 : -1;
        lo += b; hi += b>=0 ? lo=UInt64(b));
        lo += c; hi += c>=0 ? lo=UInt64(c));
    
        // divide, do a correction when high/low modulos add up
        return hi>=0 ? lo/3 + hi*hdiv3 + (lo%3 + hi*hmod3)/3
                     : lo/3+1 + hi*hdiv3 + Int64(lo%3-3 + hi*hmod3)/3;
    }
    

提交回复
热议问题