【发布时间】:2016-05-01 18:40:26
【问题描述】:
对于我开发的无符号整数类型库,我有一个专门的 C 风格 for 循环,用于计算存储数值中的有效位。我一直在为如何将其转换为 Swift 2.2+ 样式的 for 循环而苦苦挣扎。这是有问题的代码:
/// Counts up the significant bits in stored data.
public var significantBits: UInt128 {
// Will turn into final result.
var significantBitCount: UInt128 = 0
// The bits to crawl in loop.
var bitsToWalk: UInt64 = 0
if self.value.upperBits > 0 {
bitsToWalk = self.value.upperBits
// When upperBits > 0, lowerBits are all significant.
significantBitCount += 64
} else if self.value.lowerBits > 0 {
bitsToWalk = self.value.lowerBits
}
if bitsToWalk > 0 {
// Walk significant bits by shifting right until all bits are equal to 0.
for var bitsLeft = bitsToWalk; bitsLeft > 0; bitsLeft >>= 1 {
significantBitCount += 1
}
}
return significantBitCount
}
我确信有多种方法可以处理这个问题,我可以想出一些更详细的方法来处理这个问题,但我有兴趣找到一种简洁的方法来处理这种情况,我可以重新应用于类似的情况。我发现我很少使用 C 风格的 for 循环,但是当我这样做时,它是用于像这样的奇怪场景,它是处理问题的最简洁的方法。
【问题讨论】:
-
你不能用“while”循环替换它吗?
-
您可以简单地使用
while循环,或this cool code 来自@MartinR。 -
@nhgrif 你可以通过加载我的 UInt128 项目在 GitHub 上查看我的全部源代码。
-
你没有链接到它。但实际上,如果您将问题归结为实际的相关部分(只是循环)并包含确切的最少代码量,如果我将其复制并粘贴到操场上,它可以正常工作,这将是最理想的。加上一些测试用例。
-
有什么原因不能使用
log2()来计算有效位数吗?
标签: swift