1.不使用(a+b)/2这种方式,求两个数的平均值。
方法一(考虑溢出问题):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
int avg2(int x, int y)
{
int max = 0;
int min = 0;
int res = 0;
max = (x - y >= 0) ? x : y;
//max=((a-b)>>31)?-1:(a-b?1:0);
//考虑最高位是1还是0
min = (x - y < 0) ? x : y;
res = min + (max - min) / 2;
return res;
}
int main()
{
int a = 0;
int b = 0;
printf("Input two number:");
scanf("%d%d", &a, &b);
printf("%d\n", avg(a, b));
system("pause");
return 0;
}
方法二:(&按位与运算:a&a=a;)
#include<stdio.h>
#include<Windows.h>
#include<math.h>
#pragma warning (disable :4996)
int main()
{
int a = 10;
int b = 20;
int sum = ((a&b) + (a^b) >> 1);
printf("%d", sum);
system("pause");
return 0;
}
方法三(位操作运算符):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int add(int x, int y)//①用来实现加法的函数
{
int tmp = 0;
do
{
tmp = x^y;
y = x&y;
x = tmp;
y <<= 1;//进位
} while (y != 0);
return x;
}
int avg(int x, int y)//②用来求平均值的函数
{
return add(((x^y) >> 1), x&y);
}
int main()
{
int a = 0;
int b = 0;
printf("Input two number:");
scanf("%d%d", &a, &b);
printf("%d\n", avg(a, b));
system("pause");
return 0;
}