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