1. 程式人生 > >【C語言】求一個數的二進位制中 1 的個數

【C語言】求一個數的二進位制中 1 的個數

求一個數的二進位制的1的個數

1,通過模除的方法

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{   
	int i = 0;
	int count = 0;
	printf("請輸入一個數字:\n");
	scanf("%d",&i);
	while(i)
	{
		if(i%2==1)
	    {
		   count++;
	    }
		i = i/2;
	}
	printf("這個數中1的個數為:%d個1\n",count);
}

2,但是這樣會有缺陷,如果輸入一個負數的話,對於符號為的控制就不是很好

     將其單獨寫成一個函式,並且傳進去成unsigned int num,可以解決

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int  count_one_bits(unsigned int num)
{
	int count = 0;
    while(num)
	{
		if(num%2 == 1)
		{
			count++;
		}
		num = num/2;
	}
	return count;
}

int main()
{	
	int num = 11;
	int result = 0;
	result = count_one_bits(num);
	printf("這個數中的1的個數為:%d個1\n",result);
	return 0;
}

3,由於一般的數的二進位制位都是32位,有可能不能完全的統計1的個數,用迴圈來解決

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int  count_one_bits(unsigned int num)
{
	int count = 0;
	int i = 0; 
	for(i=1; i<32; i++)
	{
		if(num%2 == 1)
		{
			count++;
		}
		num = num/2;
	}
    return count;
}
int main()
{	
	int num = 0;
	int result = 0;
	printf("請輸入一個數:\n");
	scanf("%d",&num);
	result = count_one_bits(num);
	printf("%d的二進位制數中1的個數為:%d個1\n",num,result);
	return 0;
}

4,迴圈的次數是32次,這樣程式就有些慢,改用與的方法就可以很好地解決

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int  count_one_bits(unsigned int num)
{
	int count = 0;
	while(num)
	{
	num = num&(num-1);
		count++;
	}
    return count;
}
int main()
{	
	int num = 0;
	int result = 0;
	printf("請輸入一個數:\n");
	scanf("%d",&num);
	result = count_one_bits(num);
	printf("%d的二進位制數中1的個數為:%d個1\n",num,result);
	return 0;
}





 

相關推薦

C語言個數二進位制位模式從左到右翻轉後對應的十進位制值。

用函式unsigned int reverse_bit(unsigned int value)實現想要的功能 value是我們想要求的值。 #include <stdio.h> #include <math.h> unsigned

C語言個數二進位制 1個數

求一個數的二進位制的1的個數 1,通過模除的方法 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { int i = 0;

C語言千以內的素數 第一種方法

第一種方法:平常思維(人們第一印象會想到的)   //什麼是素數? -- 除了1和本身之外不能被其他數整除的數 #include "stdio.h" int main(){ int n,j,f;//變數解釋:n為我們要判斷的數,j為要與n相除的數,f為標誌 0 表示不是素數

c語言個數二進位制序列逆序,然後輸出逆序之後的二進位制序,所對應的數

<pre name="code" class="cpp">// 將一個數的二進位制序列逆序,然後輸出逆序之後的二進位制序,所對應的數 #include <stdio.h> // 從原數拿出最低位,放到mid中,mid左移,原數右移 int r

C語言推斷個數是否為2的n次方

post data- popu scanf scan ng- 輸入 ont print //推斷一個數是否為2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))

C語言判斷個數是不是迴文數

 所謂迴文數,就是說一個數字從左邊讀和從右邊讀的結果是一模一樣的。 首先,我們來判斷一下一個數是否為迴文數: #define _CRT_SECURE_NO_WARNINGS 1 #include&

C語言個數的最大公約數

思路: 輾轉相除法:以小的數除大數,所得的是整數,那這個數就是最大公約數,不然就用餘數來除剛才的除數,直到得到整數,這時作為除數的就是最大公約數。 #include<stdio.h>

c語言判斷個數n能否同時被3和5整除

// 判斷一個數n能否同時被3和5整除 #include <stdio.h> int main() { int n; printf("請輸入一個整數:"); scanf("%d",&n); if( n % 3 == 0 &&

C語言判斷個數的奇偶(位操作)

//判斷一個數的奇偶 #include <stdio.h> int is_signal(int num) { if (num & 1) return 1; else r

C語言判斷個數是否為2的n次方

//判斷一個數是否為2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))) //去掉一個1

C語言Fibonacci數列前40項(迴圈)

程式碼為:  //求Fibonacci數列前40項 #include "stdio.h" int main(){ long int f1,f2,i; f1 = 1; f2 = 1; //賦初始值 for(i = 1;i<=20;i++){//迴圈20次,一次兩個,結

C語言Fibonacci數列的前20項(陣列)

//求Fibonacci數列的前20項 #include "stdio.h" int main(){     int i,j;     int f[20] = {1,1};//賦值數列前兩項     

C語言N的階乘

求N的階乘  //輸入一個數 n ,求n! #include "stdio.h" int main(){ int n,i; double l = 1; //提高精度 printf("Enter N:"); scanf("%d",&n); for(i = n; i

C語言使用異或運算子交換兩個數

異或交換兩個數: #include<stdio.h> #include<stdlib.h> int main() { int a, b; a = 10; b = 20; a= a^b; b =a^b; a =a^b; printf("%d\n%d\n", a

C語言1-N的和(遞迴法)

遞迴公式: 條件:f(1) = 1 遞迴條件:f(n-1) + n 為了手機顯示方便(配圖): 程式碼為: //求1-N的和 #include "stdio.h" int f(int n) { //定義函式f 出口為n等於1,否則將n與f(n-1)相

C語言階乘與階乘之和

  中學我們都學習了階乘的求法,比如要求整數n的階乘,則n!=n×(n-1)×(n-2)×…×2×1。現在有兩個問題,要用C語言編寫程式求n的階乘,以及求1!+2!+3!…+n!,該如何解決呢?   問題1:求n的階乘。   實現思路:   問題中的n需要

C語言數值的正數次方

//數值的正數次方 //實現函式double power(double base, int exponent),求base的exponent次方,不得使用庫函式,不需要考慮大數問題。 //注意:考慮非

C語言100~200之間的素數

分析:    判斷一個正整數m是否為素數有多種方法。         方法1:讓m依次被2,3,…,m-1除,如果m不能被2~m-1中的任何一個整數整除,則m是素數。         方法2:讓m依次被2,3,…,m/2除,如果m不能被2~m/2中的任何一個整數整除,則m是

C語言編寫一個函式,實現兩個數的交換 詳細解答

今天在用函式寫兩數交換的時候發現有點小挫折,然後經過多次查詢驗證才發現是因為地址不對的緣故,我在此放出兩種交換的方法,先發錯誤的如下:#include <stdio.h> void swap(int a,int b) { int temp=a; a

C語言序列2/1+3/2+5/3+8/5+13/8+........前20項和。

我們能直接從序列上觀察出規律:(1)首先每一項的分母都與其前一項的分子相等, (2)每一項的分子都等於其前一項的分子與分母和。知道了規律,我們就好辦事兒!#include <stdio.h> int main () { double i = 2.0,j =