high bits of long multiplication in Java?

前端 未结 7 916
说谎
说谎 2020-12-19 14:35

Is there any way to get the high half of the multiplication of two longs in Java? I.e. the part that vanishes due to overflow. (So the upper 64 bits of the 128-

相关标签:
7条回答
  • 2020-12-19 15:30

    Here is a code snippet from Java's Math.multiplyHigh(long,long)

        public static long multiplyHigh(long x, long y) {
            if (x < 0 || y < 0) {
                // Use technique from section 8-2 of Henry S. Warren, Jr.,
                // Hacker's Delight (2nd ed.) (Addison Wesley, 2013), 173-174.
                long x1 = x >> 32;
                long x2 = x & 0xFFFFFFFFL;
                long y1 = y >> 32;
                long y2 = y & 0xFFFFFFFFL;
                long z2 = x2 * y2;
                long t = x1 * y2 + (z2 >>> 32);
                long z1 = t & 0xFFFFFFFFL;
                long z0 = t >> 32;
                z1 += x2 * y1;
                return x1 * y1 + z0 + (z1 >> 32);
            } else {
                // Use Karatsuba technique with two base 2^32 digits.
                long x1 = x >>> 32;
                long y1 = y >>> 32;
                long x2 = x & 0xFFFFFFFFL;
                long y2 = y & 0xFFFFFFFFL;
                long A = x1 * y1;
                long B = x2 * y2;
                long C = (x1 + x2) * (y1 + y2);
                long K = C - A - B;
                return (((B >>> 32) + K) >>> 32) + A;
            }
        }
    

    As from Java 9, this is included in java.lang.Math and probably direct call to it should be made. Posting the source just to show what is going on "under the hood".

    0 讨论(0)
提交回复
热议问题