You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ES6:求将整数转为2的幂位位置字符串数组的智能单行写法

基于ES6的整数转二进制位位置字符串数组的单行实现

当然有啦!这里有几个基于ES6的简洁单行/内联写法,完美满足你的需求——把整数转换成字符串数组,数组元素是该数二进制表示中为1的位对应的位置(从1开始计数,就像你举的13 => ["1","3","4"]的例子,因为2⁰+2²+2³=13,对应位置1、3、4):

方法1:利用字符串反转遍历

这种写法通过将数字转为二进制字符串后反转,直接遍历每一位判断是否为1:

const intToBitPositions = n => Array.from({ length: n.toString(2).length }, (_, i) => 
  n.toString(2).split('').reverse()[i] === '1' ? (i + 1).toString() : null
).filter(Boolean);

逻辑说明:

  1. n.toString(2)把整数转为二进制字符串(比如13会变成"1101")
  2. 反转字符串后,每一位的索引对应原二进制的“从右往左数的位置”(索引0对应2⁰,也就是位置1)
  3. 遍历每一位,遇到'1'就把索引+1转成字符串,否则返回null
  4. 最后用filter(Boolean)过滤掉所有null值,得到目标数组

方法2:位运算优化写法

如果追求更高性能,推荐用位运算直接判断每一位是否为1,避免字符串操作:

const intToBitPositions = n => [...Array(n === 0 ? 0 : Math.floor(Math.log2(n)) + 1)].map((_, i) => 
  (n & (1 << i)) ? (i + 1).toString() : null
).filter(Boolean);

逻辑说明:

  1. Math.floor(Math.log2(n)) + 1计算出数字的最高位位置(比如13的log2约为3.7,取整+1得到4,对应最高位2³)
  2. 1 << i生成对应位的掩码(比如i=0是1,i=2是4)
  3. n & (1 << i)判断该位是否为1,结果非0则说明该位是1
  4. 同样将符合条件的位置(i+1)转成字符串,过滤后得到结果

测试示例

console.log(intToBitPositions(13)); // 输出 ["1","3","4"]
console.log(intToBitPositions(8));  // 输出 ["4"]
console.log(intToBitPositions(0));  // 输出 []

内容的提问来源于stack exchange,提问作者user1547821

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:37:43