Added implementations for takeHighestOneBit, countTrailingZeroBits, countLeadingZeroBits, countOneBits
This commit is contained in:
committed by
Ilya Gorbunov
parent
ff4c932e67
commit
be40916ff6
@@ -67,4 +67,15 @@ ALWAYS_INLINE KBoolean Kotlin_Double_isNaN(KDouble a) { return isnan(a)
|
|||||||
ALWAYS_INLINE KBoolean Kotlin_Double_isInfinite(KDouble a) { return isinf(a); }
|
ALWAYS_INLINE KBoolean Kotlin_Double_isInfinite(KDouble a) { return isinf(a); }
|
||||||
ALWAYS_INLINE KBoolean Kotlin_Double_isFinite(KDouble a) { return isfinite(a); }
|
ALWAYS_INLINE KBoolean Kotlin_Double_isFinite(KDouble a) { return isfinite(a); }
|
||||||
|
|
||||||
|
//--- Bit operations ---------------------------------------------------------//
|
||||||
|
|
||||||
|
ALWAYS_INLINE KInt Kotlin_Int_countOneBits(KInt value) { return __builtin_popcount(value); }
|
||||||
|
ALWAYS_INLINE KInt Kotlin_Long_countOneBits(KLong value) { return __builtin_popcountll(value); }
|
||||||
|
|
||||||
|
ALWAYS_INLINE KInt Kotlin_Int_countTrailingZeroBits(KInt value) { return __builtin_ctz(value); }
|
||||||
|
ALWAYS_INLINE KInt Kotlin_Long_countTrailingZeroBits(KLong value) { return __builtin_ctzll(value); }
|
||||||
|
|
||||||
|
ALWAYS_INLINE KInt Kotlin_Int_countLeadingZeroBits(KInt value) { return __builtin_clz(value); }
|
||||||
|
ALWAYS_INLINE KInt Kotlin_Long_countLeadingZeroBits(KLong value) { return __builtin_clzll(value); }
|
||||||
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@@ -108,30 +108,38 @@ internal external fun fromBits(bits: Int): Float
|
|||||||
*/
|
*/
|
||||||
@SinceKotlin("1.3")
|
@SinceKotlin("1.3")
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
public actual fun Int.countOneBits(): Int {
|
@SymbolName("Kotlin_Int_countOneBits")
|
||||||
var v = this
|
public actual external fun Int.countOneBits(): Int
|
||||||
v = (v and 0x55555555) + (v.ushr(1) and 0x55555555)
|
|
||||||
v = (v and 0x33333333) + (v.ushr(2) and 0x33333333)
|
/**
|
||||||
v = (v and 0x0F0F0F0F) + (v.ushr(4) and 0x0F0F0F0F)
|
* Counts the number of consecutive most significant bits that are zero in the binary representation of [Int] [value].
|
||||||
v = (v and 0x00FF00FF) + (v.ushr(8) and 0x00FF00FF)
|
* Returns undefined result for zero [value].
|
||||||
v = (v and 0x0000FFFF) + (v.ushr(16))
|
*/
|
||||||
return v
|
@SymbolName("Kotlin_Int_countLeadingZeroBits")
|
||||||
}
|
private external fun countLeadingZeroBits(value: Int): Int
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Counts the number of consecutive most significant bits that are zero in the binary representation of this [Int] number.
|
* Counts the number of consecutive most significant bits that are zero in the binary representation of this [Int] number.
|
||||||
*/
|
*/
|
||||||
@SinceKotlin("1.3")
|
@SinceKotlin("1.3")
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
public actual fun Int.countLeadingZeroBits(): Int = TODO()
|
public actual fun Int.countLeadingZeroBits(): Int =
|
||||||
|
if (this == 0) Int.SIZE_BITS else countLeadingZeroBits(this)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts the number of consecutive least significant bits that are zero in the binary representation of [Int] [value].
|
||||||
|
* Returns undefined result for zero [value].
|
||||||
|
*/
|
||||||
|
@SymbolName("Kotlin_Int_countTrailingZeroBits")
|
||||||
|
private external fun countTrailingZeroBits(value: Int): Int
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Counts the number of consecutive least significant bits that are zero in the binary representation of this [Int] number.
|
* Counts the number of consecutive least significant bits that are zero in the binary representation of this [Int] number.
|
||||||
*/
|
*/
|
||||||
@SinceKotlin("1.3")
|
@SinceKotlin("1.3")
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
public actual fun Int.countTrailingZeroBits(): Int = TODO()
|
public actual fun Int.countTrailingZeroBits(): Int =
|
||||||
// Int.SIZE_BITS - (this or -this).inv().countLeadingZeroBits()
|
if (this == 0) Int.SIZE_BITS else countTrailingZeroBits(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a number having a single bit set in the position of the most significant set bit of this [Int] number,
|
* Returns a number having a single bit set in the position of the most significant set bit of this [Int] number,
|
||||||
@@ -140,7 +148,7 @@ public actual fun Int.countTrailingZeroBits(): Int = TODO()
|
|||||||
@SinceKotlin("1.3")
|
@SinceKotlin("1.3")
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
public actual fun Int.takeHighestOneBit(): Int =
|
public actual fun Int.takeHighestOneBit(): Int =
|
||||||
if (this == 0) 0 else 1.shl(Int.SIZE_BITS - 1 - countLeadingZeroBits())
|
if (this == 0) 0 else 1.shl(Int.SIZE_BITS - 1 - countLeadingZeroBits(this))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a number having a single bit set in the position of the least significant set bit of this [Int] number,
|
* Returns a number having a single bit set in the position of the least significant set bit of this [Int] number,
|
||||||
@@ -188,22 +196,38 @@ public actual fun Int.rotateRight(bitCount: Int): Int =
|
|||||||
*/
|
*/
|
||||||
@SinceKotlin("1.3")
|
@SinceKotlin("1.3")
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
public actual fun Long.countOneBits(): Int = TODO()
|
@SymbolName("Kotlin_Long_countOneBits")
|
||||||
// high.countOneBits() + low.countOneBits()
|
public actual external fun Long.countOneBits(): Int
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts the number of consecutive most significant bits that are zero in the binary representation of [Long] [value].
|
||||||
|
* Returns undefined result for zero [value].
|
||||||
|
*/
|
||||||
|
@SymbolName("Kotlin_Long_countLeadingZeroBits")
|
||||||
|
private external fun countLeadingZeroBits(value: Long): Int
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Counts the number of consecutive most significant bits that are zero in the binary representation of this [Long] number.
|
* Counts the number of consecutive most significant bits that are zero in the binary representation of this [Long] number.
|
||||||
*/
|
*/
|
||||||
@SinceKotlin("1.3")
|
@SinceKotlin("1.3")
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
public actual fun Long.countLeadingZeroBits(): Int = TODO()
|
public actual fun Long.countLeadingZeroBits(): Int =
|
||||||
|
if (this == 0L) Long.SIZE_BITS else countLeadingZeroBits(this)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts the number of consecutive least significant bits that are zero in the binary representation of [Long] [value].
|
||||||
|
* Returns undefined result for zero [value].
|
||||||
|
*/
|
||||||
|
@SymbolName("Kotlin_Long_countTrailingZeroBits")
|
||||||
|
private external fun countTrailingZeroBits(value: Long): Int
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Counts the number of consecutive least significant bits that are zero in the binary representation of this [Long] number.
|
* Counts the number of consecutive least significant bits that are zero in the binary representation of this [Long] number.
|
||||||
*/
|
*/
|
||||||
@SinceKotlin("1.3")
|
@SinceKotlin("1.3")
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
public actual fun Long.countTrailingZeroBits(): Int = TODO()
|
public actual fun Long.countTrailingZeroBits(): Int =
|
||||||
|
if (this == 0L) Long.SIZE_BITS else countTrailingZeroBits(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a number having a single bit set in the position of the most significant set bit of this [Long] number,
|
* Returns a number having a single bit set in the position of the most significant set bit of this [Long] number,
|
||||||
@@ -211,7 +235,8 @@ public actual fun Long.countTrailingZeroBits(): Int = TODO()
|
|||||||
*/
|
*/
|
||||||
@SinceKotlin("1.3")
|
@SinceKotlin("1.3")
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
public actual fun Long.takeHighestOneBit(): Long = TODO()
|
public actual fun Long.takeHighestOneBit(): Long =
|
||||||
|
if (this == 0L) 0L else 1L.shl(Long.SIZE_BITS - 1 - countLeadingZeroBits(this))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a number having a single bit set in the position of the least significant set bit of this [Long] number,
|
* Returns a number having a single bit set in the position of the least significant set bit of this [Long] number,
|
||||||
|
|||||||
Reference in New Issue
Block a user