不使用(a+b)/2這種方式,求兩個數的平均值。
阿新 • • 發佈:2018-12-30
不使用(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; }