1.程式設計實現: 兩個int(32位)整數m和n的二進位制表達中, 有多少個位(bit)不同? 輸入例子: 1999 2299 輸出例子:7
阿新 • • 發佈:2018-12-30
方法一:
演算法思想:由於要找兩個數對應不同位元位的個數,可以先將兩個數按位異或,然後再統計異或後的數中的一的個數,而統計二進位制中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;
}