題目:請實現乙個函式,輸入乙個整數,輸出該數二進位製表中1的個數。例如,把9表示成二進位制是1001,有兩位是1,因此,如果輸入9,則該函式輸出2。
下面給出四種演算法:
1.基本思路是判斷二進位制中最右邊一位是不是1;接著右移一位,此時右邊數起的第二位被移到了最右邊,再判斷是不是1;這樣每次移動一位,直到計算出所有的1。
我們知道1除最右邊一位外所有位都為0,所以我們只要讓該整數與1做與運算就好。
int getbits1(unsigned char ch)//0010 1011->4;1000 0000->1
ch >>= 1;
} return count;
}
型別用的是unsigned,我們也可以用int表示,但是上述方法用來輸入乙個負數後,我們知道右移後最高位還是1。這樣會導致出現死迴圈。
右移一位和把整數除以2在數學上是等價的,但是除法效率比移位運算要低的多,所以在實際程式設計中應盡可能地用移位運算代替乘除法。
2.為了避免死迴圈,我們可以不右移。首先和1做與運算,判斷n的最低位是不是1。接著把1左移一位得到2,再和整數n做與運算,就可以判斷次低位是不是1。直到計算出所有的1。
int number1(int n)
return count;
}
這種演算法整數中有多少個1,就要迴圈多少次。
3.把乙個整數減去1,再和原整數做與運算,會把該整數最右邊的1變為0。很多二進位制的問題都可以用這種思路解決。
int getbits2(unsigned char ch)
return count;
}
這種演算法整數中有多少個1,就進行多少次操作。
4.查表(用空間換時間)
int getbits(unsigned char ch)
; return bits[ch];
}
統計二進位制數 dp
題目描述 輸入乙個正整數m,請輸出從0到m中每乙個數字二進位制數中含有1的個數的總和,由於數值較大結果需要模100000.輸入格式 乙個m輸出格式 二進位制數中含有1的個數的總和s 輸入輸出樣例輸入2 輸出2輸入5 輸出7說明 提示 樣例說明 20 的資料 m 500 50 的資料 m 1000 7...
求二進位制數中有多少個1
演算法函式 1 int bit count one unsigned intn 2 下面我們來詳細解說如下 0x55555555的二進位制位01010101010101010101.n 0x55555555意思就是保留0,2,4,6,8.等偶數字上的1,而 n 1 0x55555555是代表保留奇數...
python二進位制數加1 二進位制中為1的位數
二進位制中為1的位數 題目要求 給定乙個整數,請計算二進位制中為1的位數 輸入 13 輸出 3 解釋 13的二進位制表示是 1101,位為1的數量是3 思路分析 如果乙個數是奇數,那麼它的二進位制的最後一位一定是1,道理很簡單,其他的位都表示2n 只有最後一位表示20 我們可以利用最後一位是否為1來...