不使用(a+b)/2这种方式,求两个数的平均值。

版权声明:[email protected] https://blog.csdn.net/qq_271334644/article/details/83660293

不使用(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;
}

猜你喜欢

转载自blog.csdn.net/qq_271334644/article/details/83660293