Use common implementation of fastLog2 based on countLeadingZeroBits
This commit is contained in:
@@ -11,17 +11,6 @@ internal actual fun defaultPlatformRandom(): Random =
|
|||||||
Random(js("(Math.random() * Math.pow(2, 32)) | 0").unsafeCast<Int>())
|
Random(js("(Math.random() * Math.pow(2, 32)) | 0").unsafeCast<Int>())
|
||||||
|
|
||||||
|
|
||||||
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_26: Double = 2.0.pow(-26)
|
||||||
private val INV_2_53: Double = 2.0.pow(-53)
|
private val INV_2_53: Double = 2.0.pow(-53)
|
||||||
internal actual fun doubleFromParts(hi26: Int, low27: Int): Double =
|
internal actual fun doubleFromParts(hi26: Int, low27: Int): Double =
|
||||||
|
|||||||
@@ -28,9 +28,6 @@ public fun java.util.Random.asKotlinRandom(): Random =
|
|||||||
internal actual inline fun defaultPlatformRandom(): Random =
|
internal actual inline fun defaultPlatformRandom(): Random =
|
||||||
IMPLEMENTATIONS.defaultPlatformRandom()
|
IMPLEMENTATIONS.defaultPlatformRandom()
|
||||||
|
|
||||||
internal actual fun fastLog2(value: Int): Int =
|
|
||||||
31 - Integer.numberOfLeadingZeros(value)
|
|
||||||
|
|
||||||
internal actual fun doubleFromParts(hi26: Int, low27: Int): Double =
|
internal actual fun doubleFromParts(hi26: Int, low27: Int): Double =
|
||||||
(hi26.toLong().shl(27) + low27) / (1L shl 53).toDouble()
|
(hi26.toLong().shl(27) + low27) / (1L shl 53).toDouble()
|
||||||
|
|
||||||
|
|||||||
@@ -336,9 +336,11 @@ public fun Random.nextLong(range: LongRange): Long = when {
|
|||||||
|
|
||||||
|
|
||||||
internal expect fun defaultPlatformRandom(): Random
|
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
|
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. */
|
/** Takes upper [bitCount] bits (0..32) from this number. */
|
||||||
internal fun Int.takeUpperBits(bitCount: Int): Int =
|
internal fun Int.takeUpperBits(bitCount: Int): Int =
|
||||||
this.ushr(32 - bitCount) and (-bitCount).shr(31)
|
this.ushr(32 - bitCount) and (-bitCount).shr(31)
|
||||||
|
|||||||
Reference in New Issue
Block a user