在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML5  HTML/ 一道初級(jí)算法題(二進(jìn)制轉(zhuǎn)十進(jìn)制)

一道初級(jí)算法題(二進(jìn)制轉(zhuǎn)十進(jìn)制)

做一道codewars上面初級(jí)的一道算法題看到的別人的答案。(js寫(xiě)的)
二進(jìn)制轉(zhuǎn)十進(jìn)制,我能看得懂,也能推出來(lái)。
就是不知道其中的數(shù)學(xué)原理是什么?
還是我想多了,沒(méi)什么道理,純屬智商問(wèn)題?......

const binaryArrayToNumber = arr => {
  return arr.reduce((a,b)=>(a<<1|b),0);
};
回答
編輯回答
野橘

@浮囡 說(shuō)的很對(duì), 就是題主不懂得的地方。

[1, 0, 1, 1, 0, 0, 0]
全程二進(jìn)制看:

  1. a << 1 ==> 0 << 1 ==> 00, 00 | 01 ==> 01 => a
  2. a << 1 ==> 01 << 1 ==> 010, 010 | 00 ==> 010 => a
  3. a << 1 ==> 010 << 1 ==> 0100, 0100 | 01 ==> 0101 => a

......
a = 1011000(2) = 88(10)

2018年5月27日 01:28
編輯回答
咕嚕嚕

沒(méi)看出來(lái)算法,感覺(jué)就是一個(gè)拼接二進(jìn)制數(shù)的方法
a左移一位,b補(bǔ)位

2018年2月9日 20:42
編輯回答
心上人

隨便選中一個(gè)整數(shù)(Math.floor(100000 * Math.random())),假設(shè)是 42910,轉(zhuǎn)換成二進(jìn)制((42910).toString(2)),得到字符串 "1010011110011110"。這個(gè)字符串其實(shí)也就表示了十進(jìn)制數(shù) 42910 的二進(jìn)制位序

把這個(gè)字符串變成數(shù)組((42910).toString(2).split("").map(s => parseInt(s))),得到 [1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0]。

現(xiàn)在暫停一下,我們想想,如果是 [4, 2, 9, 1, 0] 要生成對(duì)應(yīng)的十進(jìn)制整數(shù)應(yīng)該怎么做?是不是:

[4, 2, 9, 1, 0]
    .reduce((num, n) => num * 10 + n, 0);

如果分解 reduce 過(guò)程就是

0 * 10 + 4 = 4
4 * 10 + 2 = 42
42 * 10 + 9 = 429
429 * 10 + 1 = 4291
4291 * 10 + 0 = 42910

好了,回過(guò)頭來(lái),我們要處理的是一個(gè)二進(jìn)制數(shù)據(jù),它是按 2 進(jìn)位計(jì)算,也就是說(shuō),每次循環(huán)不再是 * 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

再進(jìn)一步,用乘法比較慢,但用移位就比較快了。移位是二進(jìn)制操作,左移一位就相當(dāng)于 * 2(就好像對(duì)于 10 進(jìn)制數(shù),左移一位右邊補(bǔ) 0 就是 * 10 一樣)。所以上面的 * 2 可以改成 << 1;而 + n 這里,由于 n 取值只可能是 1 或者 0,在二進(jìn)制數(shù)末位是 0 (左移位后肯定是 0)的情況下, + n| n 是等效的。于是得到了題主的運(yùn)算式。

2018年8月6日 20:51