做一道codewars上面初级的一道算法题看到的别人的答案。(js写的)
二进制转十进制,我能看得懂,也能推出来。
就是不知道其中的数学原理是什么?
还是我想多了,没什么道理,纯属智商问题?......
const binaryArrayToNumber = arr => {
return arr.reduce((a,b)=>(a<<1|b),0);
};
做一道codewars上面初级的一道算法题看到的别人的答案。(js写的)
二进制转十进制,我能看得懂,也能推出来。
就是不知道其中的数学原理是什么?
还是我想多了,没什么道理,纯属智商问题?......
const binaryArrayToNumber = arr => {
return arr.reduce((a,b)=>(a<<1|b),0);
};
@浮囡 说的很对, 就是题主不懂得的地方。
[1, 0, 1, 1, 0, 0, 0]
全程二进制看:
......
a = 1011000(2) = 88(10)
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
随便选中一个整数(
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]
要生成对应的十进制整数应该怎么做?是不是:如果分解 reduce 过程就是
好了,回过头来,我们要处理的是一个二进制数据,它是按 2 进位计算,也就是说,每次循环不再是
* 10
,而是* 2
,所以这也能得到答案
42910
再进一步,用乘法比较慢,但用移位就比较快了。移位是二进制操作,左移一位就相当于
* 2
(就好像对于 10 进制数,左移一位右边补 0 就是* 10
一样)。所以上面的* 2
可以改成<< 1
;而+ n
这里,由于 n 取值只可能是 1 或者 0,在二进制数末位是 0 (左移位后肯定是 0)的情况下,+ n
和| n
是等效的。于是得到了题主的运算式。