object PowerOfTwoCheck {
// Method A: Bit‑counting
def isPowerOfTwoA(x: Int): Boolean = {
if (x <= 0) false
else x.toBinaryString.count(_ == '1') == 1
}
// Method B: Bitwise trick
def isPowerOfTwoB(x: Int): Boolean =
x > 0 && (x & (x - 1)) == 0
// Method C: Repeated division
def isPowerOfTwoC(x: Int): Boolean = {
if (x <= 0) return false
var n = x
while (n % 2 == 0) {
n /= 2
}
n == 1
}
// Method D: Using logarithms
def isPowerOfTwoD(x: Int): Boolean = {
if (x <= 0) false
else {
val logv = math.log(x) / math.log(2)
math.abs(logv - logv.round) < 1e-10
}
}
def main(args: Array[String]): Unit = {
val test1 = 16 // true
val test2 = 18 // false
println(s"A: ${isPowerOfTwoA(test1)}, ${isPowerOfTwoA(test2)}")
println(s"B: ${isPowerOfTwoB(test1)}, ${isPowerOfTwoB(test2)}")
println(s"C: ${isPowerOfTwoC(test1)}, ${isPowerOfTwoC(test2)}")
println(s"D: ${isPowerOfTwoD(test1)}, ${isPowerOfTwoD(test2)}")
}
}
/*
OUTPUT:
A: true, false
B: true, false
C: true, false
D: true, false
*/