在操作数是类型化数组的 JavaScript 中,乘法、加法、减法和除法的最有效方法是什么?



出于某种原因,我想既然TypedArrays表示二进制有符号和无符号整数的序列,我们可以使用普通运算符对它们进行加法、减法、乘法和除法。

使用位运算符,它不起作用:

const a = new Uint8Array([0x1, 0x1, 0x1, 0x1])
// 4369, 1000100010001b
const b = new Uint8Array([0x1, 0x1, 0x1, 0x1])
// 4369, 1000100010001b
const c = a >>> 8 // desired outcome: 10001
const d = a & b   // desired outcome: 1000100010001
const e = a | b   // desired outcome: 1000100010001
const f = a ^ b   // desired outcome: 0111011101110
// actual results:
console.log('c:', c) // 0
console.log('d:', d) // 0
console.log('e:', e) // 0
console.log('f:', f) // 0

它也不适用于算术运算符:

const a = new Uint8Array([0x1, 0x1, 0x1, 0x1]) // 4369
const b = new Uint8Array([0x1, 0x1, 0x1, 0x1]) // 4369
const c = a + b 
const d = a - b
const e = a * b
const f = a / b
// desired:
console.log(c === new Uint8Array([0x2, 0x2, 0x2, 0x2])) // want: true
console.log(d === new Uint8Array([0x0, 0x0, 0x0, 0x0])) // want: true
console.log(e === new Uint8Array([0x1, 0x1, 0x1, 0x1])) // want: true
console.log(f === new Uint8Array([0x1, 0x1, 0x1, 0x1])) // want: true
// but those are all false, instead:
console.log('c:', c) // 1,1,1,11,1,1,1
console.log('d:', d) // NaN
console.log('e:', e) // NaN
console.log('f:', f) // NaN

我尝试使用三元运算符来解决这个问题,但也没有成功。我相信我可以做一些从Typed Array到number再到back的低效转换,但我想还有更好的方法。我在谷歌上搜索和浏览了文档,但什么都没有出现。在Typed Arrays之间实际执行按位和算术运算的最有效方法是什么?

答案已经很明显了,这要归功于@Bergi的另一个答案,尽管我没有意识到。通过使用BigUint64Array视图,可以将ArrayBuffer的64位倍数作为单个BigInt进行访问,然后可以通过访问一个或多个索引(在后一种情况下,将它们组合起来(对数组进行计算,并与任何期望的算术/逐位运算符一起用作正常操作数。

相关内容

  • 没有找到相关文章

最新更新