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