題目:輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。
題目解析:最直觀的解法是先判斷整數二進位制表示中最右邊以為是不是1.接著把整數右移一位(這邊用右移不用除以2,是因為除法運算效率比移位運算要低得多),這樣每次移動一位,直到整數為0.但是這樣子會有乙個問題,當輸入是乙個負整數,由於負整數最高位是1,右移一位後必須保持最高位還是1,這樣一直死迴圈下去,因為移位後的數永遠不會為0,最高位都是1,而且這個數最終會變成0xffffffff。所以不能單純的用移位運算,或者不能在原數上做移位運算。可以對另乙個比較數採取移位運算:
a.首先讓原數與flag=1作與運算,結果為0表示最右邊移位為0,不為0表示最右邊移位為1;
b.將flag左移一位,繼續上一步。
c.直到flag=0;
這是通常採用的方式,但是要判斷32位(因為整數4個位元組,32位);
下面介紹一種判斷次數少的方法(或者只判斷1的個數次):
演算法思想:把乙個整數減去1,在與原數做與運算,會把該整數最右邊的1變成0(例如原數1100,減1得1011,做完與運算後得1000.).那麼乙個整數的二進位制表示中有多少個1 ,就可以進行多少次這樣的操作。總操作明顯小於上乙個方法。
演算法源**;
public class solution
return count;}
public static void main(string args)}
乙個整數的二進位制表示中1的個數
給定乙個整數,判斷其二進位制表示中1的個數。第一種比較直接的思路是 1.把這個數的低位與1取與運算,2.再把這個數右移1位,3.返回1,結果 統計這個過程中1的個數。但這種思路存在乙個侷限,就是如果這個數是負數,那麼符號位在右移的過程中仍舊是1,這樣迴圈結束的條件不太好判斷,而且,這也改變了輸入的引...
整數二進位制表示中1的個數
出自 題目 輸入乙個整數,求該整數的二進位制表達中有多少個1。例如輸入10,由於其二進位制表示為1010,有兩個1,因此輸出2。分析 這是一道很基本的考查位運算的面試題。包括微軟在內的很多公司都曾採用過這道題。乙個很基本的想法是,我們先判斷整數的最右邊一位是不是1。接著把整數右移一位,原來處於右邊第...
整數的二進位制表示中1的個數
給出通常能想到的方式,這兩種方式在 c和指標 一書中給出。以下討論的均為非負整數。該方法每次在迴圈中判斷數的二進位制最右一位是否為1 如果該數能不能被2整除 每次迴圈後該數右移一位。因此遍歷了數的二進位制表示的每一位。int count one bits1 int value 與上邊方法類似,也是每...