1. 程式人生 > >1.程式設計實現: 兩個int(32位)整數m和n的二進位制表達中, 有多少個位(bit)不同? 輸入例子: 1999 2299 輸出例子:7

1.程式設計實現: 兩個int(32位)整數m和n的二進位制表達中, 有多少個位(bit)不同? 輸入例子: 1999 2299 輸出例子:7

方法一:

演算法思想:由於要找兩個數對應不同位元位的個數,可以先將兩個數按位異或,然後再統計異或後的數中的一的個數,而統計二進位制中1的個數有三種方法;1.這個數迴圈按位

於比它小1的數,直到這個數為0為止;2.把這個數的每一個二進位制位拿出來,用的方法是和1相與,移位,迴圈直到這個數為0;3.摸2除2,迴圈到這個數為0為止;分別對應以

下程式一、二、三

程式一:

#include <stdio.h>
#include <windows.h>
int main()
{
	int m=0;
	int n=0;
	int q=0;
	int i=0;
	int count=0;
	printf("請輸入兩個數字:");
	scanf("%d%d",&m,&n);
	q=m^n;  // 兩個數按位異或,對應不同的位將會置1
	while(q)
	{
		q=q&(q-1);  //按位與方法計算一個整數中位元位為1的個數
		count++;
	}
	printf("count=%d",count);
	system("pause");
	return 0;
}
程式二:
#include <stdio.h>
#include <windows.h>
int main()
{
	int m=0;
	int n=0;
	int q=0;
	int i=0;
	int count=0;
	printf("請輸入兩個數字:");
	scanf("%d%d",&m,&n);
	q=m^n;  // 兩個數按位異或,對應不同的位將會置1
	for(i=0;i<32;i++)
	{
		if((q>>i)&1==1)  //將得到的結果右移、和1按位與,拿到每一個二進位制位為1的位元位
		{
			count++;
		}
	}
	printf("count=%d",count);
	system("pause");
	return 0;
}
程式三:
#include <stdio.h>
#include <windows.h>
int main()
{
	int m=0;
	int n=0;
	int q=0;
	int i=0;
	int count=0;
	printf("請輸入兩個數字:");
	scanf("%d%d",&m,&n);
	q=m^n;  // 兩個數按位異或,對應不同的位將會置1
	while(q)
	{
		if(q%2==1)
		{
			count++;
		}
		q=q/2;  //注意這條語句應該放在if語句外面,否則q%2不等於0時,移不了位
	}
	printf("count=%d",count);
	system("pause");
	return 0;
}
方法二:

演算法思想:直接分別把兩個數的32位二進位制序列依次拿出來相比較(用和1相與移位再迴圈的方法),不一樣時計數器加1,最後統計計數器的個數

程式:

#include <stdio.h>
int main()
{
	int m=0;
	int n=0;
	int i=0;
	int count=0;
	scanf("%d%d",&m,&n);
	for(i=0;i<32;i++)
	{
		if(((m>>i)&1) != ((n>>i)&1))  //從最低位開始沒輸出各一位不同,計數器加1
		{
			count++;
		}
	}
	printf("count=%d",count);
	return 0;
}