編寫乙個函式,輸入是乙個無符號整數,返回其二進位制表示式中數字位數為 『1』 的個數(也被稱為漢明重量)。
示例:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進位制串 00000000000000000000000000001011 中,共有三位為 '1'。
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進位制串 11111111111111111111111111111101 中,共有 31 位為 '1'。
題目描述:
因為輸入的是無符號數字,所以如果數字的最高位為 1,右移的話高位也會補 0。所以可以用左移來做,**如下:
class solution
return cnt;
}};
注意,如果輸入的 n 是有符號數,就不能這樣做了。因為,如果 n 是負數,那麼右移高位會補 1。
我們設定乙個掩碼 mask = 1,每次將 mask 左移一位,移動 32 次,每次移動都和 n 做與操作,如果結果為 1,說明 n 的當前位為 1。**如下:
class solution
return cnt;
}};
如果 n 是有符號整數,這種方法也能得到正確的答案,而思路 1 會發生錯誤。
將 n 和 n-1 做與運算,會使得 n 的最低位的1變為 0. 例如,n = 3 = 11,n-1 = 2 = 10, n&(n-1) = 11&10 = 10. 所以,假設 n 和 n-1 做與運算 cnt 次後,n 變為 0,則 說明 n 中有 cnt 個 1.**如下:
class solution
return cnt;
}};
位運算(1) 初識位運算
前段時間數電課學了些進製轉換,還有與或非等邏輯運算,如今再來看看位運算,倒輕鬆了不少。很早就想寫些非總結性部落格了,奈何還是太懶。也也不知怎的突然又來了興致,趕忙寫下這篇部落格。廢話不多說,今天準備總結總結關於位運算的知識。程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的,即0 1兩種狀態,...
LeetCode 位1的個數(位運算)
include using namespace std class solution return result 方法2 o m m為n的二進位制的位數 減1操作將最右邊的符號從0變到1,從1變到0,與操作將會移除最右端的1。如果最初n有x個1,那麼經過x次這樣的迭代運算,n將減到0。inthamm...
LeetCode之位運算
public intadd int a,int b return a 劍指offer 64 求1 2 n 難度 中等 求 1 2 n 要求不能使用乘除法 for while if else switch case等關鍵字及條件判斷語句 a?b c 題解 用遞迴的方法的 public intsumnu...