1. 程式人生 > >不使用(a+b)/2這種方式,求兩個數的平均值。

不使用(a+b)/2這種方式,求兩個數的平均值。

不使用(a+b)/2這種方式,求兩個數的平均值。 

思路:

第一種:移位;  (a+b)>>1

第二種 : a+((b-a)>>1) -->a+(b-a)/2 ----(a+b)/2

  b+((a+b)>>1)

第三種 : & ^

&的作用 1011 &1101  ----->1001   

^的作用  1011 ^1101 -----> 0110  

(a+b)/2 ----->a&b +(a^b)>>1

    (1011 +1101)/2     = ((11)11(11))/2---->1(1/2)(1/2)1

兩個數的平均值: 兩個數對應的二進位制位值的平均

程式實現:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//方法一
int  average(int m, int n){
	return (m + n) >> 1;
}
//方法二
int average1(int m, int n){
	return m + ((n - m) >> 1);
}
//方法三
int average2(int m, int n){
	return (m & n) + ((m ^ n) >> 1);
}
int main(){
	int  m = 0;
	int  n = 0;
	scanf("%d %d", &m, &n);
	printf("%d\n",average(m, n));
	printf("%d \n", average1(m, n));
	printf("%d\n", average2(m, n));
	system("pause");
	return 0;
}