如何对Base32/Base36格式的超大数执行求和运算?
处理Base36大数加法的实现方案
JavaScript的Number类型仅能精确表示253以内的整数,2200远超出这个范围,直接用数字类型运算会丢失精度。要实现类似十六进制的Base36大数运算,你可以通过两种方式解决:
方案一:手动实现Base36字符串加法
核心是基于字符串逐位计算+进位处理,逻辑通用,也可扩展到Base32:
// Base36字符与数值映射表 const base36Chars = '0123456789abcdefghijklmnopqrstuvwxyz'; const charToNum = new Map([...base36Chars].map((c, i) => [c, i])); const numToChar = new Map([...base36Chars].map((c, i) => [i, c])); // 两个Base36字符串相加函数 function addBase36(a, b) { // 反转字符串,方便从低位开始计算 const arrA = [...a.toLowerCase()].reverse().map(c => charToNum.get(c)); const arrB = [...b.toLowerCase()].reverse().map(c => charToNum.get(c)); const maxLen = Math.max(arrA.length, arrB.length); const result = []; let carry = 0; for (let i = 0; i < maxLen || carry > 0; i++) { const digitA = arrA[i] || 0; const digitB = arrB[i] || 0; const sum = digitA + digitB + carry; result.push(sum % 36); carry = Math.floor(sum / 36); } // 反转回高位在前,转为Base36字符串 return result.reverse().map(n => numToChar.get(n)).join(''); } // 测试你的需求场景 const num200Base36 = 'bnklg118cog0000000000000000000000000000'; const sum = addBase36(num200Base36, '1'); console.log(sum); // 输出:bnklg118cog0000000000000000000000000001
如果要切换到Base32,只需修改字符集为Base32标准集(如0123456789abcdefghijklmnopqrstuv),并将进制数从36改为32即可。
方案二:利用BigInt类型(更简洁)
ES2020引入的BigInt支持任意精度整数,可直接转换Base36字符串进行运算:
// Base36字符串转BigInt function base36ToBigInt(str) { return BigInt(parseInt(str, 36)); } // BigInt转Base36字符串 function bigIntToBase36(num) { return num.toString(36); } // 测试 const num200BigInt = base36ToBigInt('bnklg118cog0000000000000000000000000000'); const sumBigInt = num200BigInt + 1n; console.log(bigIntToBase36(sumBigInt)); // 同样输出目标结果
该方案无需手动处理进位,现代浏览器和Node.js均支持BigInt。
内容的提问来源于stack exchange,提问作者Filipe
相关产品推荐
相关产品推荐

