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