as a conclusion, here is my version of Rexβs answer, which gives both a central value and a βdegreeβ, which is the minimum power at two distances from the center, which covers both a in one direction and b in the other.
@tailrec def binSplit(a: Int, b: Int, mask: Int = 0xFFFFFFFF): (Int, Int) = { val mask2 = mask << 1 if (a > (b & mask2)) (b & mask, -mask) else binSplit(a, b, mask2) } def test(): Unit = { val Seq(r1, r2) = Seq.fill(2)(util.Random.nextInt(0x3FFFFFFF) + 1) val (a, b) = if (r1 <= r2) (r1, r2) else (r2, r1) val (center, extent) = binSplit(a, b) assert((center >= a) && (center <= b) && (center - extent) <= a && (center - extent) >= 0 && (center + extent) > b, (a, b, center, extent)) } for (i <- 0 to 100000) { test() }
source share