版权声明:[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;
}