- #include<stdio.h>
- int avg1(int a, int b)
- {
- // 利用移位操作符
- // 右移移位相当于 --> 除以 2 :(a+b)>>1
- // 考虑到溢出情况: 1. 可以增加字节的大小将 4 个字节变为 8 个字节
- return a + ((b - a)>> 1);
- }
- int avg2(int a, int b)
- {
- //2.a&b+(a^b)>>1 8: 1000
- //a&b(取出了相同位的平均值), 例如 2:0010&1110-->0010 相同的位数保存为 1, 不同的位数保存为 0
- //a^b(取出了不同位的和), 例如 14:0010^1110-->1100 相同的位数保存为 0, 不同的位数保存为 1
- return (a&b) + ((a^b)>> 1);
- }
- int main()
- {
- int a, b;
- scanf("%d %d",&a,&b);
- printf("%d\n", avg1(a, b));
- printf("%d\n", avg2(a, b));
- return 0;
- }
来源: http://www.bubuko.com/infodetail-2950737.html