1. 程式人生 > >c語言用位運算實現兩個數平均數

c語言用位運算實現兩個數平均數

c語言用位運算實現兩個數平均數
對於十進位制而言,向右移動一位就是除以10,
對於二進位制而言,向右移動一位就是除以2,
對於八進位制而言,向右移動一位就是除以8,
對於十六進位制而言,向右移動一位就是除以16
因為計算機是通過二進位制來計算的,知道這個規律之後我們可以編寫程式碼

int average(intx,int y){
int c=(x+y)>1;
return c;
}

但這樣編寫缺點在於如果a或b已經是21億即將溢位的數了,那麼溢位的風險很高,於是我們可以y+(x-y)>>1,其實就是y-y/2+x/2=y/2+x/2
但其實這樣只解決了x溢位的危險,也就是界娛樂一半溢位的風險

int average(intx,int y){
int c=y+(x-y)>1;
return c;
}

其實我們可以都進行求半來運算

int average(intx,int y){
int c=(x>>1);
int d=(y>>1);
int e=(c+d)>>1
return e;
}

但似乎這樣顯得非常複雜
我們可以根據二進位制的運算技巧來編寫在這裡插入圖片描述
與操作用於將進位的數除以二
異或操做用於將沒有進位的位取出,我們取出的數再右移1位,最終結果相加。

int average(intx,int y){
int c=(x&
y)+(x^y)>>1; return c; }

下面是整部分程式碼

#include<stdio.h>
int average(int x,int y){
int c=(x&y)+(x^y)>>1;
return c;
}
int main(){
printf("%d",average(5,35));
system("pause");
return 0;
}