題目:二進位制中1的個數
解法一:(短除法——可能引起死迴圈)
解法二:(使用二進位制和位運算——可能引起死迴圈)
解法三:(常規解法)
解法四:(驚喜解法)
相關題型
題目:實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如:若輸入9,該數的二進位制為1001,所以輸出2.
#include using namespace std;
/*二進位制表示1的個數統計*/
int number_ofone(int n)
n /= 2;
} return count;
}/*10進製轉二進位制*/
上述的解法一和解法二類似,相比而言,位運算的效率要比四則運算的要高很多。但是這兩種思路都缺陷,它們沒有考慮到負整數的情況,例如:當輸入數字為0x8000 0000時,當把負數0x8000 0000右移一位,並不是把最高位的1移到第二位變成0x4000 0000,而是0xc000 0000。因為移位前是乙個負數,要保證移位後仍是乙個負數,因此一位後的最高位會設為1。如果一直做右移操作,最終數字會變為0xffff ffff而陷入死迴圈。
#include using namespace std;
int number_ofone_3(int n)
flag <<= 1;
} return count;
}int main()
return count;
}int main()
執行結果:
1.用一條語句判斷乙個整數是不是2的整數次方。
答案:if(n&(n-1)==0)
解析:根據上述解法四提供給我們的思路,舉一反三,乙個整數如果是2的整數次方,那麼它的二進位制有且只有一位是1,那麼整數n&(n-1)就將整數的唯一乙個1變為了0,所以得到上述答案。
2.輸入兩個整數m和n,計算需要改變m的二進位制幾位才能得到n。比如10的二進位制為1010,13的二進位制1101,需要改變三位才能將10變成13.
思路:先進行異或運算(異或運算相同取0不同取1的法則)得出結果,只要再統計結果中1的個數就能知道兩個數的不同位數。
**實現:
#include using namespace std;
int chang_num(int m, int n)
return count;
}int main()
執行結果:
二進位制 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...
程式設計題 統計二進位制中1的個數
問題 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。解題思路 因為負數用補碼表示,對於負數右移時,在最高位補得是1,因此負數移位位產生無限個1,陷入死迴圈。出現死迴圈的錯誤答案 int numberof1 cannotuse int n 把n的2進製形式往右推一位 n n 1 負...
二進位制中1的個數 二進位制中0的個數
1 題目 實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數,例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。2 解法 解法 一 可能會引起死迴圈的解法 基本思路 先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原理處於從右邊數起的第二位...