一个数 n ∈ [a, b]
计算中间值 m
第一种方法(会溢出):m = ( a + b ) / 2
int a = 10_0000_0000; // 10亿
int b = 12_0000_0000; // 12亿
int m = (a + b) / 2;
System.out.println(m); // -1047483648
第二种方法(不会溢出):m = a + ( ( b - a ) >> 1 ) 或 m = a + ( ( b - a ) / 2 )
int a = 10_0000_0000; // 10亿
int b = 12_0000_0000; // 12亿
int m = a + ((b - a) >> 1);
// 或者 int m = a + ((b - a) / 2);
System.out.println(m); // 1100000000
第三种方法(不会溢出):m = ( a & b) + ( ( a ^ b) >> 1 )
int a = 10_0000_0000; // 10亿
int b = 12_0000_0000; // 12亿
int m = (a & b) + ((a ^ b) >> 1);
System.out.println(m); // 1100000000
注:
a >> n
等价于a / (2^n)
a << n
等价于a * (2^n)
a & 1
等价于a % 2