題目描述
編寫一個(gè)函數(shù)战得,輸入是一個(gè)無(wú)符號(hào)整數(shù)棘利,返回其二進(jìn)制表達(dá)式中數(shù)字位數(shù)為 ‘1’ 的個(gè)數(shù)(也被稱為漢明重量)废士。
相關(guān)話題:位運(yùn)算 ???? 難度:簡(jiǎn)單
示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進(jìn)制串 00000000000000000000000000001011 中患久,共有三位為 '1'。
示例 2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進(jìn)制串 00000000000000000000000010000000 中示启,共有一位為 '1'兢哭。
示例 3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進(jìn)制串 11111111111111111111111111111101 中领舰,共有 31 位為 '1'夫嗓。
提示:
請(qǐng)注意,在某些語(yǔ)言(如 Java)中冲秽,沒(méi)有無(wú)符號(hào)整數(shù)類型舍咖。在這種情況下,輸入和輸出都將被指定為有符號(hào)整數(shù)類型锉桑,并且不應(yīng)影響您的實(shí)現(xiàn)排霉,因?yàn)闊o(wú)論整數(shù)是有符號(hào)的還是無(wú)符號(hào)的,其內(nèi)部的二進(jìn)制表示形式都是相同的民轴。
在 Java 中攻柠,編譯器使用二進(jìn)制補(bǔ)碼記法來(lái)表示有符號(hào)整數(shù)。因此后裸,在上面的 示例 3 中瑰钮,輸入表示有符號(hào)整數(shù) -3。
解法1:
看到這個(gè)問(wèn)題很容易想到的思路是
1 . 用1去和數(shù)字n做與運(yùn)算微驶,如果結(jié)果是1浪谴,那么1的個(gè)數(shù)就增加1
- 然后數(shù)字n右移1位,繼續(xù)做步驟1的操作因苹,直到n等于0
public class Solution {
public int NumberOf1(int n) {
int count = 0;
//while(n != 0){
//n!=0作為判斷條件是錯(cuò)誤的苟耻,這會(huì)陷入死循環(huán),
//一個(gè)負(fù)數(shù)的移位的過(guò)程中其最高位1始終是不變的
//那還是移動(dòng)32次吧扶檐,因?yàn)槭莍nt型
for(int i = 0;i < Integer.SIZE;i++){
count += n & 1;
n = n >> 1;
}
return count;
}
}
解法2:
核心思想:一個(gè)數(shù)減去1后和自身做與運(yùn)算會(huì)把該數(shù)的最右邊一個(gè)1變成0
那么就看數(shù)字n能做多少次n = n & (n-1)這樣的操作凶杖,直到n == 0結(jié)束,次數(shù)就是1的個(gè)數(shù)款筑。
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
while(n != 0){
n = n & (n-1);
count++;
}
return count;
}
}