import kotlin.math.roundToInt
object PowerOfTwoCheck {
// Method A: Bit‑counting
fun isPowerOfTwoA(x: Int): Boolean {
if (x <= 0) return false
return x.toString(2).count { it == '1' } == 1
}
// Method B: Bitwise trick
fun isPowerOfTwoB(x: Int): Boolean =
x > 0 && (x and (x - 1)) == 0
// Method C: Repeated division
fun isPowerOfTwoC(x: Int): Boolean {
if (x <= 0) return false
var n = x
while (n % 2 == 0) {
n /= 2
}
return n == 1
}
// Method D: Using logarithms
fun isPowerOfTwoD(x: Int): Boolean {
if (x <= 0) return false
val logv = kotlin.math.log2(x.toDouble())
return kotlin.math.abs(logv - logv.roundToInt()) < 1e-10
}
@JvmStatic
fun main(args: Array<String>) {
val test1 = 16 // true
val test2 = 18 // false
println("A: ${isPowerOfTwoA(test1)}, ${isPowerOfTwoA(test2)}")
println("B: ${isPowerOfTwoB(test1)}, ${isPowerOfTwoB(test2)}")
println("C: ${isPowerOfTwoC(test1)}, ${isPowerOfTwoC(test2)}")
println("D: ${isPowerOfTwoD(test1)}, ${isPowerOfTwoD(test2)}")
}
}
/*
OUTPUT:
A: true, false
B: true, false
C: true, false
D: true, false
*/