node有原生n位数的加减法吗?
发布于 4 年前 作者 kknbb 3341 次浏览 来自 问答

比如我现在有2段buffer buf1: <Buffer ff ff ff f0> buf2: <Buffer 00 00 00 0f> 已知这两段buffer代表一个无符号的32位数, 然后求和, 要求值也是一个32位数 我现在的做法是先 readUInt32BE 读出这两个数, 然后做加法 但是有一个明显的溢出的问题 我现在的做法是自己写一个方法, 手动按位加然后处理溢出 但是碰到多个数的时候, 我需要不停用交换律去处理很麻烦, 比如buf1 + buf2先处理然后在用这个和去+buf3, 求和之后再去+buf4 这样做明显很蠢 就想问一下有没有原生的n位数的加减法?

9 回复

试试看用bigint作加法,得到结果后处理32位溢出,然后转为number。

try:

const limit = 4294967295n // Buffer.from([0,0,0,0, 0xff, 0xff, 0xff, 0xff])
const buf1a = Buffer.from([0,0,0,0, ...buf1])
const buf2a = Buffer.from([0,0,0,0, ...buf2])
const ret1 =  buf1a.readBigInt64BE() + buf2a.readBigInt64BE() // 4294967295n

if (ret1 <= limit && ret1 >= Number.MIN_SAFE_INTEGER) {
  const ret2 = Number(ret1)
 // do something
}
else {
 // handel overflow
}

@waitingsong 老哥可能没理解我意思 您这段跟我现在差不多,大概也是这种形式(buf1:Buffer, buf2:Buffer) => number 溢出我倒是知道怎么处理 我想要的是直接累加, 比如buf1+buf2…+bufn, 结果直接就是一个安全的32位数 而不是 safeAdd(buf3, safeAdd(buf1,buf2))这样套娃套下去

那你如何处理溢出呢?

这不是leetcode上面的题吗,,去把最优解抄过来放到Math对象上假装Math支持。

@waitingsong 直接按位& 0xffffffff就行了啊

@ganshiqingyuan 老哥能说题目编号吗, 我看了下没找到

@kknbb 那就开始用bigint做加法,最后做一次按位与不行么

@waitingsong 我觉得这个方法不错,效率应该也还行的。

回到顶部