diff --git a/libraries/stdlib/js/src/kotlin/random/PlatformRandom.kt b/libraries/stdlib/js/src/kotlin/random/PlatformRandom.kt index 2cdfba60066..da191aff618 100644 --- a/libraries/stdlib/js/src/kotlin/random/PlatformRandom.kt +++ b/libraries/stdlib/js/src/kotlin/random/PlatformRandom.kt @@ -11,17 +11,6 @@ internal actual fun defaultPlatformRandom(): Random = Random(js("(Math.random() * Math.pow(2, 32)) | 0").unsafeCast()) -internal actual fun fastLog2(value: Int): Int { - // TODO: not so fast, make faster - var v = value - var log = -1 - while (v != 0) { - v = v.ushr(1) - log++ - } - return log -} - private val INV_2_26: Double = 2.0.pow(-26) private val INV_2_53: Double = 2.0.pow(-53) internal actual fun doubleFromParts(hi26: Int, low27: Int): Double = diff --git a/libraries/stdlib/jvm/src/kotlin/random/PlatformRandom.kt b/libraries/stdlib/jvm/src/kotlin/random/PlatformRandom.kt index 1ec21e6ce05..fcdf9455f3a 100644 --- a/libraries/stdlib/jvm/src/kotlin/random/PlatformRandom.kt +++ b/libraries/stdlib/jvm/src/kotlin/random/PlatformRandom.kt @@ -28,9 +28,6 @@ public fun java.util.Random.asKotlinRandom(): Random = internal actual inline fun defaultPlatformRandom(): Random = IMPLEMENTATIONS.defaultPlatformRandom() -internal actual fun fastLog2(value: Int): Int = - 31 - Integer.numberOfLeadingZeros(value) - internal actual fun doubleFromParts(hi26: Int, low27: Int): Double = (hi26.toLong().shl(27) + low27) / (1L shl 53).toDouble() diff --git a/libraries/stdlib/src/kotlin/random/Random.kt b/libraries/stdlib/src/kotlin/random/Random.kt index 4b7d7b00a67..996c814afef 100644 --- a/libraries/stdlib/src/kotlin/random/Random.kt +++ b/libraries/stdlib/src/kotlin/random/Random.kt @@ -336,9 +336,11 @@ public fun Random.nextLong(range: LongRange): Long = when { internal expect fun defaultPlatformRandom(): Random -internal expect fun fastLog2(value: Int): Int // 31 - Integer.numberOfLeadingZeros(value) internal expect fun doubleFromParts(hi26: Int, low27: Int): Double +@UseExperimental(ExperimentalStdlibApi::class) +internal fun fastLog2(value: Int): Int = 31 - value.countLeadingZeroBits() + /** Takes upper [bitCount] bits (0..32) from this number. */ internal fun Int.takeUpperBits(bitCount: Int): Int = this.ushr(32 - bitCount) and (-bitCount).shr(31)