如何快速计算 UInt16 值数组的总和?
Posted
技术标签:
【中文标题】如何快速计算 UInt16 值数组的总和?【英文标题】:How to calculate the sum of array of UInt16 values in swift? 【发布时间】:2019-11-23 13:37:31 【问题描述】:如何在swift5中计算一组UInt16值的总和。 下面我分享我的代码,
let myArray: [UInt16] = [23200, 23200, 23300, 23300, 23200, 23300, 23200]
let sumOfArray = myArray.reduce(0, $0 + $0 )
print("sum of myArray is \(sumOfArray)")
当我计算数组值的总和时,它给出了一个错误 “执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)。”
请帮帮我。
【问题讨论】:
【参考方案1】:UInt16
是 16 位,因此它可以容纳的最大无符号整数值为 65535。它小于您的结果总和 162700。
使用
let myArray: [UInt16] = [23200, 23200, 23300, 23300, 23200, 23300, 23200]
let sumOfArray = myArray.reduce(0, (UInt32($0) + UInt32($1)) )
print("sum of myArray is \(sumOfArray)")
甚至更强大
let sumOfArray = myArray.reduce(0, $0 + UInt($1)) )
顺便说一句,我相信你有一个错字,在你的 reduce
中你的意思是 $0 + $1
【讨论】:
【参考方案2】:添加到@Kamil 的答案,
如果只需要返回 UInt16,可以使用溢出运算符:
let myArray: [UInt16] = [23200, 23200, 23300, 23300, 23200, 23300, 23200]
let sumOfArray = myArray.reduce(0, $0 &+ $1 )
print("sum of myArray is \(sumOfArray)")
【讨论】:
但是很明显,由于溢出,sumOfArray
不会真正代表数字的总和,而是一些难以理解的值。
@Rob True,但是如果我们需要在我们的应用程序中处理 UInt16 中的值,那么我们也需要向下转换。这可以在我们需要 UInt16 中的值时使用。
很好,但不要称它为“总和”,因为它不再是数值的总和。这归结为计算总数的目的。例如。如果对这些值进行平均,则创建 32 位或 64 位和,除以数组中的项目数,然后才将结果重新转换为必要的 16 位。但我认为截断的 16 位“和”有什么用处的情况很少。以上是关于如何快速计算 UInt16 值数组的总和?的主要内容,如果未能解决你的问题,请参考以下文章
将 uint8_t 数组转换为 C 中的 uint16_t 值
将指向 uint16_t 的指针传递给需要 C 中 uint8_t[] 数组的子例程 - 如何?
如何使用扩展或映射运算符将此公式应用于 Uint16 对数组?