輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。
1、可能引起死迴圈的解法:
基本思路:先判斷整數二進位制表示中最右邊一位是不是1,接著把輸入的整數右移一位,此時原來處於從右邊數起第二位被移到最右邊了,再判斷是不是1,這樣每移次動一位,知道整個整數變成0為止。
那麼,如何判斷乙個整數的最右邊是不是1呢? 如果乙個整數與1做與運算的結果是1,則表示該整數最右邊一位是1,否則是0。
//每次判斷最高位,右移
int numberof1(int n)
return count;
}
注意:(1)把整數右移一位相當於把整數除以2,因為除法的效率比移位運算低得多,在程式設計中盡量使用移位代替乘除法。2、常規解法:(2)如果輸入乙個負數,如果最高位是1,右移時並不是簡單地把最高位的1移到第二位,這是因為移位前是乙個負數,仍然要保證移位後還是乙個負數,所以移位後的最高位會設為1。如果一直右移,可能會陷入死迴圈,變成了0xffffffff。
首先把n和1做位與運算,判斷n的最低位是不是1,接著把1左移一位得到2,再和n做與運算,判斷n的次低位是不是1。這樣反覆左移。
//先判斷n的最低位, 左移
class solution
return count;
}};
迴圈次數等於整數二進位制的位數(如32位)。
3、更好的解法:(整數中有幾個1就只需要迴圈幾次)
把乙個整數減去1,都是把最右邊的1變成0,如果他的右邊還有0,則所有的0都變成1,而他左邊的所有位都保持不變。把乙個整數減去1再和原整數做與運算,相當於把它最右邊的1變成0。
思路:把乙個整數減去1,再和原整數做與運算,會把該整數最右邊的1變成0.那麼乙個整數的二進位制表示中有多少個1,就可以進行多少次這樣的操作。
class solution
return count;
}};
劍指Offer精選程式設計面試題15 二進位制中1的個數
2 思路 3 與測試 要求 輸入乙個整數,輸出該數二進位制表示中1的個數。如輸入9,則輸出2。總體來分三種 思路一弊端 此操作輸入負數的時候容易引發死迴圈,因為負數移位的時候最高位會設為1,容易陷入死迴圈。思路二弊端 此操作的迴圈次數為整數二進位制的位數,為常規解法。思路三優勢 此操作的迴圈次數為整...
劍指offer 面試題 15 二進位制中1的個數
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。初始化無符號整型變數 bit 1。迴圈依次將 bit 與 數 做與運算,如果結果為0,則 bit 左移一位 否則計數器 count 加1,同時bit 左移一位 當 bit 為 0 時 比如乙個int 型變數佔32位,那麼 bit 左移...
劍指offer 面試題15 二進位制中1的個數
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。解決 1.位運算 乙個數減1的結果和它本身進行與運算,等於把這個數的二進位制表示中最右邊的1變成0。public int numberof1 int n return count 2.取巧 使用integer.bitcount int...