如何在SWIFT中检查数字是否为2的幂

时间:2018-01-22 11:49:44

标签: swift

我找到了很多解决它的例子,但在SWIFT中没有。请帮忙

像这样smthng

输入:n = 4 输出:是的 2 ^ 2 = 4

输入:n = 7 输出:否

输入:n = 32 输出:是的 2 ^ 5 = 32

我需要算法来检查一个数字是否是2的幂。如4,8,16,32,64 ....是2的数字幂

3 个答案:

答案 0 :(得分:4)

Determining if an integer is a power of 2 来自Bit Twiddling Hacks 几乎逐字翻译成Swift:

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

示例:

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

或者作为泛型函数,以便它可以与所有二进制文件一起使用 整数类型:

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

示例:

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

或作为协议扩展名:

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

示例:

print(1048576.isPowerOfTwo)  // true
print(Int(50).isPowerOfTwo)  // false

答案 1 :(得分:2)

部分答案:

如果它是FixedWidthInteger并且它是正数且其non zero bit count是1,则它是2的幂。

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

对于浮点数,我认为你可以测试significand。如果它正好是1,则该数字是2的幂。

let x: Double = 4

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

我还没有在Playground中检查过,所以可能是错误的。

答案 2 :(得分:-2)

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. 

希望这有效。