zoukankan      html  css  js  c++  java
  • 求两个数的平均值,不能只用(a+b)/2的方法

     1 #include<stdio.h>
     2 
     3 int avg1(int a, int b)
     4 {
     5     //利用移位操作符
     6     //右移移位相当于——>除以2    :(a+b)>>1
     7     //考虑到溢出情况:1.可以增加字节的大小将4个字节变为8个字节
     8     return a + ((b - a) >> 1);
     9 }
    10 
    11 int avg2(int a, int b)
    12 {
    13     //2.a&b+(a^b)>>1                    8:               1000
    14     //a&b(取出了相同位的平均值),例如 2:0010&1110——>0010 相同的位数保存为1,不同的位数保存为0
    15     //a^b(取出了不同位的和),例如    14:0010^1110——>1100 相同的位数保存为0,不同的位数保存为1
    16     return (a&b) + ((a^b) >> 1);
    17 }
    18 
    19 int main()
    20 {
    21     int a, b;
    22     scanf("%d %d",&a,&b);
    23     printf("%d
    ", avg1(a, b));
    24     printf("%d
    ", avg2(a, b));
    25     return 0;
    26 }
  • 相关阅读:
    【hdu4035】Maze
    【bzoj2707】走迷宫
    【CF123E】Maze
    【CF113D】Museum
    【recording】gdoi2018
    最近公共祖先(LCA)(题目)
    回转寿司
    counting
    B
    A
  • 原文地址:https://www.cnblogs.com/cuckoo-/p/10363316.html
Copyright © 2011-2022 走看看