1、普通做法,每次除2取餘位1則加1:
#include
int main()
num = num / 2;
}printf("%d\n", count);
return
0;}
正數的話問題,但是乙個是效率比較差,乙個是負數的時候有錯,而且可能會溢位(變成小數什麼的)
2、優化:可以使用向右移位代替除2運算:num=num>>1;(右移運算只是返回乙個移位之後的值,但是移位的值本身不改變) 右移分邏輯一位位和算數移位。無符號數執行邏輯移位,右移一位,左邊補0;有符號數執行算數移位,右移一位,左邊補符號位(負數補1,正數補0)
但是負數還是有問題
3、優化:使用按位與運算代替求模運算:if ((num&1)==1)
但是負數還是會有問題
4、 對於負數來說,和正數會有不同的地方,例如-1的補碼:
原碼: 10000000 00000000 00000000 00000001
反碼: 11111111 11111111 11111111 11111110(符號位不變,其餘按位取反)
補碼: 11111111 11111111 11111111 11111111(反碼加1)
這時候使用上邊的方法將達不到目的。。。
#include
int main()
printf("%d\n", count);
return
0;}
二進位制 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...
二進位制中1的個數 二進位制中0的個數
1 題目 實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數,例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。2 解法 解法 一 可能會引起死迴圈的解法 基本思路 先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原理處於從右邊數起的第二位...
二進位制中1的個數
這種方法速度比較快,其運算次數與輸入n的大小無關,只與n中1的個數有關。如果n的二進位制表示中有k個1,那麼這個方法只需要迴圈k次即可。其原理是不斷清除n的二進位制表示中最右邊的1或者最左邊的1,同時累加計數器,直至n為0 如7 0111 通過與 7 1 0110 與操作消去最最左邊的1,並累加計數...