《劍指Offer》11 二進位制中1的個數

2021-09-10 22:31:19 字數 1056 閱讀 8891

題目:11. 二進位制中1的個數

知識點:位運算

題目描述:

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。

解題思路:

解法一:這是我當時自己的思路,即通過除二取餘法來求輸入的十進位制數字的二進位制的每一位,再判斷其是否為一,當輸入數字為負數的時候,取其補碼(原數字取反加一),我使用的取補碼的方式是直接用無符號的最大值加上負數再加一,相當於負數補碼對應的正數,然後再使用前面所說的方法,對每一位進行判斷。

解法二:是《劍指offer》中提供的一種一般秀的解法,即當判斷每一位是否為 1 的時候,先取乙個同一位為 1 其餘位都為零的數,比如當要判斷右一位是否為 1 的時候,取數字 0000 0001, 然後使原數字同這個數進行位與運算,如果結果為 1 則說明原數字的當前位為 1 ,判斷完當前位後如果當前位位 1 則計數加一,同理從右向左依次進行下一位的判斷直至判斷完所有位。

解法三:這個就是比較秀的的一種解法了,他利用的原理是,當乙個數字減一後,其二進位制中最右邊的第乙個為一的位和其右側的位都會取反,而其左側不變,比如 1100 減一為 1011,這樣我們只需要通過將原數字減一再與原數字進行位與運算,即相當於消耗掉其最右邊為一的那位,比如 1100 減一為 1011 ,1011 再與原數字(1100)進行位於運算即為 1000,這樣依次進行下去,每次都消耗掉最右邊為一的位並計數,直至消耗掉二進位制中的所有的 1(數字變為 0 )。

**:

//解法一(自研):

int numberof1(int n)

return res;

}//解法二(劍指offer 一般的秀):

int numberof1_solution1(int n)

return count;

}//解法三:(劍指offer 非常的秀):

int numberof1_solution2(int n)

return count;

}

劍指Offer 11 二進位制中1的個數

思路 如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1 如果最右邊的1後面還有0的話 其餘所有位將不會受到影響。舉個例子 乙個二進位制數1100,從右邊數起第三位是處於最右邊的乙個1。減去1後,第三位變成0...

劍指offer 11 二進位制中1的個數

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。用1 1自身左移運算,其實後來就不是1了 和n的每位進行位與,來判斷1的個數 public class solution11 flag flag 1 return count public static void main strin...

劍指Offer(11) 二進位制中1的個數

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。思路一 直接使用integer類的tobinarystring 方法轉換成二進位制字串,然後遍歷即可。思路二 如果乙個整數不為0,那麼這個整數至少有一位是1。把這個整數減1,那麼原來在整數最右邊的1就會變為0,原來在1後面的所有的0都...