arrays - 如何将整数分解为 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 个组件的幂?
解决方案
您可能正在寻找类似的东西。正如它所写的那样,当值不匹配时它会崩溃,但您可以根据您的目的对其进行调整。尽管它确实使用了移位,但它仍然可以很好地转换为您的枚举。
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())
这将打印出您在问题末尾给出的示例。
推荐阅读
- bash - 如何比较字段 1 和字段 5,其中字段 1 和字段 5 是数字
- java - 忽略:java.util.zip.ZipException:无效的 CEN 标头(重复条目)
- javascript - 通过单击按钮将 textarea 内容更改回其起始形式
- java - 在抽象类中使用泛型方法时返回调用类
- openlayers - 如何将要素的属性导出为 KML 文件?
- delphi - 检测可编辑 TWebBrowser 中的更改
- bash - 仅在文件存在时附加到文件
- c# - Xamarin API 与 WebAPI 服务
- json - 在最低级别将 JSON“解包”到 SQL Server 表中的最佳方法是什么?
- javascript - 如何为窗口轮播菜单设置动画?