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);
逻辑说明:
n.toString(2)把整数转为二进制字符串(比如13会变成"1101")- 反转字符串后,每一位的索引对应原二进制的“从右往左数的位置”(索引0对应2⁰,也就是位置1)
- 遍历每一位,遇到
'1'就把索引+1转成字符串,否则返回null - 最后用
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);
逻辑说明:
Math.floor(Math.log2(n)) + 1计算出数字的最高位位置(比如13的log2约为3.7,取整+1得到4,对应最高位2³)1 << i生成对应位的掩码(比如i=0是1,i=2是4)n & (1 << i)判断该位是否为1,结果非0则说明该位是1- 同样将符合条件的位置(i+1)转成字符串,过滤后得到结果
测试示例
console.log(intToBitPositions(13)); // 输出 ["1","3","4"] console.log(intToBitPositions(8)); // 输出 ["4"] console.log(intToBitPositions(0)); // 输出 []
内容的提问来源于stack exchange,提问作者user1547821
相关产品推荐
相关产品推荐

