摘要:例如把表示成二進(jìn)制是,有位是。首先對(duì)于二進(jìn)制的求解,在這里,我們最應(yīng)該想到的就是關(guān)于位運(yùn)算的一些操作符。總共有五種運(yùn)算,分別是與,或,異或,右移,左移。當(dāng)為負(fù)數(shù)時(shí),右移在最高位補(bǔ)為了保證數(shù)據(jù)為負(fù)數(shù),因而最終就會(huì)形成死循環(huán)。
二進(jìn)制中1的個(gè)數(shù)
請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示1的個(gè)數(shù)。例如把9表示成二進(jìn)制是1001,有2位是1。因此如果輸入9,該函數(shù)輸出2。
首先對(duì)于二進(jìn)制1的求解,在這里,我們最應(yīng)該想到的就是關(guān)于位運(yùn)算的一些操作符。總共有五種運(yùn)算,分別是:與(&),或(|),異或(^),右移(>>),左移(<<)。
第一種可能會(huì)引起死循環(huán)的解法:
思路1:先對(duì)你所給的這個(gè)整數(shù)進(jìn)行判斷,這個(gè)數(shù)的最右邊是不是1。如果是1,給一個(gè)計(jì)數(shù)器,給它加1。接著把輸入的整數(shù)右移一位,這樣一直進(jìn)行移位,最后直到這個(gè)整數(shù)變成0為止,然后輸出計(jì)數(shù)器就好了。
function NumberOf1(n) { let count = 0; while(n) { if(n & 1) { count ++; } n = n >> 1; } return count; } console.log(NumberOf1(9));
這個(gè)算法對(duì)于無(wú)符號(hào)數(shù)來(lái)說(shuō)沒(méi)有問(wèn)題,可是對(duì)于有符號(hào)數(shù)問(wèn)題就大了,極有可能造成死循環(huán)。當(dāng)n為負(fù)數(shù)時(shí),n右移在最高位補(bǔ)1(為了保證數(shù)據(jù)為負(fù)數(shù)),因而最終就會(huì)形成死循環(huán)。比如:0x80000000時(shí),這時(shí)候就會(huì)出現(xiàn)問(wèn)題,當(dāng)右移一位的時(shí)候時(shí),就變成了0xC0000000。因?yàn)槭菍?duì)負(fù)數(shù)的移位,所以必須保證移位后是個(gè)負(fù)數(shù),所以最高位永遠(yuǎn)都會(huì)是1,所以也就意味這最終這個(gè)數(shù)字永遠(yuǎn)會(huì)死循環(huán)下去。
思路2:移動(dòng)1,先判斷最低位是不是1,然后把1移成2。再與整數(shù)比比較,就能判斷倒數(shù)第二位是不是1,依次下去。。。這樣最終就能達(dá)成一個(gè)效果,得到所有的1的個(gè)數(shù)。
function NumberOf1(n) { let count = 0; let flag = 1; while(flag) { if(n & flag) { count ++; } flag = flag << 1; } return count; } console.log(NumberOf1(9));
最后,我們提供出來(lái)一種最好的方法。
思路3:把一個(gè)整數(shù)減去了1,再和原整數(shù)做與運(yùn)算,會(huì)把這個(gè)整數(shù)最右邊一個(gè)1變成0,并且把這個(gè)1后面的0都變成1。那么一個(gè)整數(shù)的二進(jìn)制有多少個(gè)1,就可以進(jìn)行多少次這樣的操作,最后,通過(guò)把計(jì)數(shù)器確定運(yùn)算次數(shù),輸出計(jì)數(shù)器就好了。
//更好的解法 function NumberOf1(n) { let count = 0; while(n) { count ++; n = (n-1) & n; } return count; } console.log(NumberOf1(9));
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/107497.html
摘要:位算法的效率有多快我就不說(shuō),不信你可以去用億個(gè)數(shù)據(jù)模擬一下,今天給大家講一講位運(yùn)算的一些經(jīng)典例子。不過(guò),最重要的不是看懂了這些例子就好,而是要在以后多去運(yùn)用位運(yùn)算這些技巧,當(dāng)然,采用位運(yùn)算,也是可以裝逼的,不信,你往下看。位算法的效率有多快我就不說(shuō),不信你可以去用 10 億個(gè)數(shù)據(jù)模擬一下,今天給大家講一講位運(yùn)算的一些經(jīng)典例子。不過(guò),最重要的不是看懂了這些例子就好,而是要在以后多去運(yùn)用位運(yùn)算這...
摘要:在開(kāi)發(fā)過(guò)程中,常常用到各種加密方法和算法,本文總結(jié)了幾種常用加密方法的原理。非對(duì)稱(chēng)加密原理非對(duì)稱(chēng)加密算法需要兩個(gè)密鑰公開(kāi)密鑰和私有密鑰。 在開(kāi)發(fā)過(guò)程中,常常用到各種加密方法和算法,本文總結(jié)了幾種常用加密方法的原理。 對(duì)稱(chēng)加密 showImg(https://segmentfault.com/img/bVbacxw?w=1128&h=468); 原理: 加密和解密數(shù)據(jù)使用同一個(gè)密鑰,適...
摘要:面試算法實(shí)踐與國(guó)外大廠習(xí)題指南翻譯自維護(hù)的倉(cāng)庫(kù),包含了在線練習(xí)算法概述與大廠習(xí)題實(shí)戰(zhàn)等內(nèi)容。面試算法實(shí)踐與國(guó)外大廠習(xí)題指南在線練習(xí)在線面試編程數(shù)據(jù)結(jié)構(gòu)鏈表即是由節(jié)點(diǎn)組成的線性集合,每個(gè)節(jié)點(diǎn)可以利用指針指向其他節(jié)點(diǎn)。 面試算法實(shí)踐與國(guó)外大廠習(xí)題指南 翻譯自 Kevin Naughton Jr. 維護(hù)的倉(cāng)庫(kù) interviews,包含了在線練習(xí)、算法概述與大廠習(xí)題實(shí)戰(zhàn)等內(nèi)容。筆者發(fā)現(xiàn)正好和...
摘要:加解密偽代碼加密解密非對(duì)稱(chēng)加密又稱(chēng)公開(kāi)秘鑰加密。常見(jiàn)的非對(duì)稱(chēng)加密算法。通常來(lái)說(shuō)對(duì)稱(chēng)加密速度要快于非對(duì)稱(chēng)加密。在之后的通訊階段,可以使用對(duì)稱(chēng)加密算法對(duì)數(shù)據(jù)進(jìn)行加密,秘鑰則是握手階段生成的。確認(rèn)信息完整未被篡改。 一、 文章概述 互聯(lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)上的數(shù)據(jù)量每天都在以驚人的速度增長(zhǎng)。同時(shí),各類(lèi)網(wǎng)絡(luò)安全問(wèn)題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開(kāi)發(fā)者,需要加強(qiáng)對(duì)安全的認(rèn)識(shí),并通過(guò)技...
閱讀 4021·2021-11-22 13:53
閱讀 1716·2021-09-23 11:52
閱讀 2434·2021-09-06 15:02
閱讀 929·2019-08-30 15:54
閱讀 900·2019-08-30 14:15
閱讀 2384·2019-08-29 18:39
閱讀 650·2019-08-29 16:07
閱讀 416·2019-08-29 13:13