如何快速计算 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[] 数组的子例程 - 如何?

uint8 小端数组到 uint16 大端

如何使用扩展或映射运算符将此公式应用于 Uint16 对数组?

SIMD -> uint16_t 数组到浮点数组在浮点上工作,然后返回到 uint16_t

如何从 Swift 中的 Big-endian 表示中计算 Int 值?