標籤:

二進位中1的個數

二進位中1的個數

輸入一個整數,輸出該數二進位表示中1的個數。

常規思路:把數字n與1進行與運算,判斷n的最低位是不是1。

接著把1左移一位,繼續與數字n做與運算,判斷n的次低位是不是1。

參考代碼:

root@gt:/home/git/Code# ./a.out 2root@gt:/home/git/Code# cat num1.c #include <stdio.h>int num1(int num){ int count = 0; unsigned int flag = 1; while(flag) { if(flag & num) { ++count; } flag <<= 1; } return count;}int main(){ int num = 9; int count = 0; count = num1(num); printf("%d
",count); return 0;}

驚喜解法:把一個整數減去1,再和原來的整數做與運算,會把該整數最右邊的1變成0。

不停的對該整數進行這樣的運算,最後該整數將變成0。

驚喜代碼:

root@gt:/home/git/Code# ./a.out 2root@gt:/home/git/Code# cat num1.c #include <stdio.h>int num1(int n){ int count = 0; while(n) { n = (n - 1) & n; count++; } return count;}int main(){ int n = 9; int count = num1(n); printf("%d
",count); return 0;}

擴展:

1.判斷一個整數是不是2的整數次方。

- 一個整數如果是2的整數次方,那麼它的二進位表示中有且只有一位是1。

2.輸入2個整數m和n,計算需要改變m的二進位中的多少位才能得到n。

- 第一步求這2個數的異或,第二步求異或中1的個數。

3.把一個整數減去1之後,再和原來的整數進行位運算,得到的結果相當於把整數的二進位中最右邊的1變成0.很多二進位問題都可以用這個思路求解!!

推薦閱讀:

6. ZigZag Conversion(medium) & 7.Reverse Integer(easy)
旋轉數組的最小數字
插入排序
調整數組順序使奇數位於偶數前面

TAG:演算法 | 筆試 |