若是兩個相應的二進制位都爲1,則該位的結果值爲1,不然爲0。
javascript
兩個相應的二進制位中只要有一個爲1,該位的結果值爲1。
java
若參加運算的兩個二進制位值相同則爲0,不然爲1。
算法
~是一元運算符,用來對一個二進制數按位取反,即將0變1,將1。
函數
用來將一個數的各二進制位所有左移N位,右補0。
優化
將一個數的各二進制位右移N位,移到右端的低位被捨棄,對於無符號數, 高位補0。
spa
編寫一個函數,輸入是一個無符號整數(以二進制串的形式),返回其二進制表達式中數字位數爲 '1' 的個數(也被稱爲漢明重量)。
提示:
請注意,在某些語言(如 Java)中,沒有無符號整數類型。在這種狀況下,輸入和輸出都將被指定爲有符號整數類型,而且不該影響您的實現,由於不管整數是有符號的仍是無符號的,其內部的二進制表示形式都是相同的。
在 Java 中,編譯器使用二進制補碼記法來表示有符號整數。所以,在上面的 示例 3 中,輸入表示有符號整數 -3。
示例 1:3d
輸入:00000000000000000000000000001011 輸出:3 解釋:輸入的二進制串 00000000000000000000000000001011 中,共有三位爲 '1'。
示例 2:code
輸入:00000000000000000000000010000000 輸出:1 解釋:輸入的二進制串 00000000000000000000000010000000 中,共有一位爲 '1'。
示例 3:blog
輸入:11111111111111111111111111111101 輸出:31 解釋:輸入的二進制串 11111111111111111111111111111101 中,共有 31 位爲 '1'。
提示:
輸入必須是長度爲 32 的 二進制串 。
進階:
若是屢次調用這個函數,你將如何優化你的算法?圖片
1.循環檢查給定的整數每一位是否爲1;
2.將n跟給定的對應位置上的數字進行與運算,若是兩個相應的二進制位都爲1,則該位的結果值爲1,結果加1,不然爲0。
var hammingWeight = function (n) { let res = 0 for (let i = 0; i < 32; i++) { //將每一位與n進行與運算,檢查是否每一位是否爲1 if ((n & (1 << i)) != 0) { res++ } } return res };
var hammingWeight = function(n) { let res = 0; while (n) { n &= n - 1; //將最低位變爲0 res++; //記錄變了幾回 } return res; };
>>>
運算符執行五無符號右移位運算。它把無符號的 32 位整數全部數位總體右移。對於無符號數或正數右移運算,無符號右移與有符號右移運算的結果是相同的。
console.log(1000 >> 3); //返回值125 console.log(1000 >>> 3); //返回值12
對於負數
console.log(-1000 >> 3); //返回值-125 console.log(-1000 >>> 3); //返回值536870787
對於負數來講,無符號右移將使用 0 來填充全部的空位,同時會把負數做爲正數來處理,所得結果會很是大因此,使用無符號右移運算符時要特別當心,避免意外錯誤。
如圖:左側空位再也不用符號位的值來填充,而是用 0 來填充。