一道初级算法题(二进制转十进制)

0 0 node.js html5 javascript
ㄨ風影ミ红ん馆
ㄨ風影ミ红ん馆

声望值:110 0人

2019-02-15 15:27:08 提问

关注 0关注

收藏 0收藏, 310浏览

做一道codewars上面初级的一道算法题看到的别人的答案。(js写的)
二进制转十进制,我能看得懂,也能推出来。
就是不知道其中的数学原理是什么?
还是我想多了,没什么道理,纯属智商问题?......

const binaryArrayToNumber = arr => {
  return arr.reduce((a,b)=>(a<<1|b),0);
};
请先 登录 后评论

3个回答

  • 小爷ㄆ我不在乎ツ45声望 2018-09-25 09:27

    没看出来算法,感觉就是一个拼接二进制数的方法a左移一位,b补位
    请先 登录 后评论
  • RAID丶小筑232声望 2018-09-25 09:27

    @浮囡 说的很对, 就是题主不懂得的地方。 [1, 0, 1, 1, 0, 0, 0]全程二进制看: a << 1 ==> 0 << 1 ==> 00, 00 | 01 ==> 01 => a a << 1 ==> 01 << 1 ==> 010, 010 | 00 ==> 010 => a a << 1 ==> 010 << 1 ==> 0100, 0100 | 01 ==> 0101 => a ......a = 1011000(2) = 88(10)
    请先 登录 后评论
  • 暴力丶小白菜103声望 2018-09-25 09:27

    随便选中一个整数(Math.floor(100000 * Math.random())),假设是 42910,转换成二进制((42910).toString(2)),得到字符串 "1010011110011110"。这个字符串其实也就表示了十进制数 42910 的二进制位序 把这个字符串变成数组((42910).toString(2).split("").map(s => parseInt(s))),得到 [1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0]。 现在暂停一下,我们想想,如果是 [4, 2, 9, 1, 0] 要生成对应的十进制整数应该怎么做?是不是: [4, 2, 9, 1, 0] .reduce((num, n) => num * 10 + n, 0); 如果分解 reduce 过程就是 0 * 10 + 4 = 4 4 * 10 + 2 = 42 42 * 10 + 9 = 429 429 * 10 + 1 = 4291 4291 * 10 + 0 = 42910 好了,回过头来,我们要处理的是一个二进制数据,它是按 2 进位计算,也就是说,每次循环不再是 * 10,而是 * 2,所以 [1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0] .reduce((num, n) => num * 2 + n, 0); 这也能得到答案 42910 再进一步,用乘法比较慢,但用移位就比较快了。移位是二进制操作,左移一位就相当于 * 2(就好像对于 10 进制数,左移一位右边补 0 就是 * 10 一样)。所以上面的 * 2 可以改成 << 1;而 + n 这里,由于 n 取值只可能是 1 或者 0,在二进制数末位是 0 (左移位后肯定是 0)的情况下, + n 和 | n 是等效的。于是得到了题主的运算式。
    请先 登录 后评论

注册新账号

悬赏追问
10
  • 10
  • 20
  • 50
  • 100
  • 200
  • 输入数值
发布追问