輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。
阿新 • • 發佈:2019-01-07
如何求二進位制中1的個數(三種方法)
思路:1.在32位中,二進位制表示數字1方式為 00000000 00000000 00000000 00000001
首先我們的第一個方法就是一位一位的找,從左邊第一位開始,每一次&1,則可以判斷
最後一位是否為1 ,程式碼如下:
2.迴圈32次感覺有點慢,所以用模除2的方式嘗試一下。程式碼如下#include <stdio.h> int Num_one(int num) { int i = 0; int count = 0; for(i=0; i<32; i++) { if(((num>>i)&1) ==1) { count++; } } return count; } int main() { int num = 0; int ret = 0; printf("請輸入一個數:"); scanf("%d",&num); ret = Num_one(num); printf("該數二進位制中一的個數為:%d\n",ret); return 0; }
嗯,感覺還不錯。int Num_one(unsigned int num)//一定要用無符號數,不然負數不好搞 { int count = 0; while(num) { if((num%2) == 1) count++; num /= 2; } return count; } int main() { int num = 0; int ret = 0; printf("請輸入一個數:"); scanf("%d",&num); ret = Num_one(num); printf("該數二進位制中一的個數為:%d\n",ret); return 0; }
3.利用數本身和(該數-1)相與的方式,感覺也不錯,這個方式的思路是,當數字二進位制-1時,最左邊的的1會被變為0,再和原數字相與,就取出了二進位制最左邊的1。
例如數字5的二進位制:101&(101-1)=100,此時已經取出最左邊的1,再用 100&(100-1)=000,此時就將兩個1全部取出。
程式碼如下:
結果展示:int Num_one(int num) { int count = 0; while(num) { num = num&(num-1); count++; } return count; } int main() { int num = 0; int ret = 0; printf("請輸入一個數:"); scanf("%d",&num); ret = Num_one(num); printf("該數二進位制中1的個數為:%d\n",ret); return 0; }