首页 > 解决方案 > 如何将整数分解为 2 的幂数组?

问题描述

我正在尝试实现类似二进制掩码之类的东西,我将 Int 转换为它的组件数组(2 的幂),例如:

69 = [64, 4, 1]

我不想使用二进制掩码和移位,因为我想将 Swift 枚举用于界面元素:

enum State: Int{
    case readyButton = 1
    case workingButton = 2
    case sleepingButton = 4
   //etc
}

then 7 = [.sleepingButton, .workingButton, .readyButton] // 7 = 4+2+1

Swift 中是否有一些工具可以帮助我将 Int 转换为 2 个组件的幂?

标签: arraysswiftmath

解决方案


您可能正在寻找类似的东西。正如它所写的那样,当值不匹配时它会崩溃,但您可以根据您的目的对其进行调整。尽管它确实使用了移位,但它仍然可以很好地转换为您的枚举。

extension UInt32 {
    func state() -> [State] {
        var bitvals: [UInt32] = []
        var mask: UInt32 = 1
        while mask > 0 {
            if mask & self > 0 {
                bitvals.append(mask)
            }
            mask = mask << 1
        }
        let state = bitvals.map { State(rawValue: $0)! }
        return state
    }
}
enum State: UInt32 {
    case readyButton = 1
    case workingButton = 2
    case sleepingButton = 4
}

let val: UInt32 = 7
print(val.state())

这将打印出您在问题末尾给出的示例。


推荐阅读