如何在JavaScript中将1-400万整数拆分为两个指定范围的数?
解决方案:用除法取余实现完整覆盖的整数拆分
你的核心问题是原位运算拆分只能覆盖256×10000=256万种组合,无法利用全部400万值——原因是低8位最多只能表示256个术语索引,远达不到你需要的400个。要覆盖所有组合,直接用整数除法和取余是最直接的方案,因为400×10000正好等于400万,完全匹配你的总数范围。
具体逻辑
把1~4000000的原整数先转成0-based(减1),再通过以下计算拆分:
- 术语索引(1~400):
(m // 10000) + 1,其中m = n - 1 - 数字部分(1~10000):
(m % 10000) + 1
这个方法能确保每个原整数对应唯一的术语+数字组合,且所有400万种组合都能被遍历到,同时原数递增时,拆分后的序列完全可预测(按术语顺序逐个遍历数字)。
替换后的JavaScript代码
log(1) log(10000) log(10001) log(2000000) log(4000000) function splitInt(int) { const m = int - 1; // 转成0-based索引 const termIndex = Math.floor(m / 10000) + 1; // 1-400 const numberPart = (m % 10000) + 1; // 1-10000 return [termIndex, numberPart]; } function log(int) { const [a, b] = splitInt(int) console.log(int, '=> [', a, b, ']') }
测试输出示例
运行后会得到:
1 => [ 1, 1 ] 10000 => [ 1, 10000 ] 10001 => [ 2, 1 ] 2000000 => [ 200, 10000 ] 4000000 => [ 400, 10000 ]
为什么原来的位运算不行?
你之前的代码用int & 0xFF获取术语索引,这只能得到0~255的范围,最多对应256个术语,远小于你需要的400个;同时(int >> 8) & 0xFFFF得到的是065535的范围,但你只需要09999,这就导致大量值被浪费,最终只能覆盖256万种组合,无法利用全部400万。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

