Encuentro muchos ejemplos para resolverlo, pero nada en SWIFT. Por favor ayuda

Algo como esto

Entrada: n = 4 Salida: Sí 2 ^ 2 = 4

Entrada: n = 7 Salida: No

Entrada: n = 32 Salida: Sí 2 ^ 5 = 32

Necesitaba un algoritmo para verificar si un número es una potencia de 2. como 4, 8, 16, 32, 64 ... es una potencia de número de dos

-1
YoungLee Chan 22 ene. 2018 a las 14:49

3 respuestas

La mejor respuesta

Determinar si un entero es una potencia de 2 del Bit Twiddling Hacks se traduce casi literalmente a Swift:

func isPowerOfTwo(_ n: Int) -> Bool {
    return (n > 0) && (n & (n - 1) == 0)
}

Ejemplo:

print(isPowerOfTwo(4))  // true
print(isPowerOfTwo(5))  // false

O como una función genérica, para que pueda usarse con todos los binarios tipos enteros:

func isPowerOfTwo<T: BinaryInteger> (_ n: T) -> Bool {
    return (n > 0) && (n & (n - 1) == 0)
}

Ejemplo:

print(isPowerOfTwo(Int16(4)))  // true
print(isPowerOfTwo(UInt8(5)))  // false

O como una extensión de protocolo :

extension BinaryInteger {
    var isPowerOfTwo: Bool {
        return (self > 0) && (self & (self - 1) == 0)
    }
}

Ejemplo:

print(1048576.isPowerOfTwo)  // true
print(Int(50).isPowerOfTwo)  // false
8
Martin R 22 ene. 2018 a las 12:49
let numberToBeChecked = 4

result = numberToBeChecked.squareRoot()

If result%1 == 0 {
    print(“4 is a power of 2”) } else {
    print(“4 is not a power of 2”)
}

//note: result%1== 0 checks if result is a whole number. 

Espero que esto funcione.

-2
davidethell 22 ene. 2018 a las 12:16

Respuesta parcial:

Si es un FixedWidthInteger y es positivo y es el recuento de bits distinto de cero es 1, entonces es una potencia de 2.

let x = 128
if x > 0 && x.nonzeroBitCount == 1
{
    // power of 2
}

Para un número de coma flotante, creo que puede probar el significand. Si es exactamente 1, el número es una potencia de 2.

let x: Double = 4

if x > 0 && x.significand == 1
{
    // Power of 2
}

Todavía no lo he comprobado en un patio de juegos, por lo que podría estar mal.

3
JeremyP 22 ene. 2018 a las 12:39