为什么在 Java 中用 (low+high)>>>1 代替 (low+high)/2 或 (low+high)>>1 来计算平均值呢?好在哪里?

>>>与>>是位运算符,只对整型有效(不能用于浮点型)。
当是整型的时候(low+high)>>1可以代替(low+high)/2。
>>>是无符号右移运算符。如果 low+high是正整数,这三种运算是等价的。
 由于有编译器优化,他们的效率应该是相同的(如果不存在编译器优化,移位运算更快)。
用>>>一般是有特殊的目的

至于>>>和>>的区别,则在于有符号和无符号。比如-2>>>1的结果是2147483647,而-2>>1的结果是-1。(其中2147483647是-2的补码右移一位后,左边补0的结果。)

这里计算平均值使用>>>取代>>,恐怕是因为可能出现很大的数字,这些数字单独用不会超过Integer.MAX_VALUE,但求和之后可能超过,这时如果使用>>或者/来计算,会因为溢出而算出负数结果。

用下面的程序可以说明问题:
    private static void testFun() {
        int low = Integer.MAX_VALUE;
        int high = Integer.MAX_VALUE;
        System.out.println("low:" + low); // 先看一眼数字
        int as = (low + high) >> 1;
        int div = (low + high) >> 1;
        int au = (low + high) >>> 1;
        System.out.println("as:" + as); // 使用 >> 计算的平均值,与/相同。
        System.out.println("div:" + div); // 使用 >> 计算的平均值,与/相同。
        System.out.println("au:" + au); // 使用 >>> 计算的平均值。
    }
   
    执行结果:
    low:2147483647
    as:-1
    div:-1
    au:2147483647

时间: 2024-08-08 01:25:20

为什么在 Java 中用 (low+high)>>>1 代替 (low+high)/2 或 (low+high)>>1 来计算平均值呢?好在哪里?的相关文章

Java中用正则表达式找出数字

Java中用正则表达式找出数字 1.题目    String str = "fjd789klsd908434jk#$$%%^38488545",从中找出78990843438488545,请找到解决办法 2.实现源码 /** * */ package com.you.model; /** * @author YouHaidong * */ public class FindNumber { /** * 字符串str */ public static String str = "

Java中用最有效率的方法算出2 乘以8 等於几?

Java中用最有效率的方法算出2 乘以8 等於几?2 << 3,因为将一个数左移n 位,就相当于乘以了2 的n 次方,那么,一个数乘以8 只要将其左移3 位即可,而位运算cpu 直接支持的,效率最高,所以,2 乘以8 等於几的最效率的方法是2 << 3.

JAVA中用 SQL语句操作小结

1.添加记录(INSERT) 使用SQL语句的INSERT命令可以向数据库中插入记录,INSERT命令的基本形式为: INSERT INTO 表名 [(字段名1,字段名2-)] VALUES (值1,值2,-) 若在输入记录时,每个字段均有内容,可省略表名后的字段名. 该SQL语句用于将值1,值2--值n分别赋给字段1,字段2,--字段n, 并为表增加一条记录.在使用该命令时要注意下面两个规则: 插入的值必须和列一一对应. 插入值的数据类型必须和对应列的数据类型相一致. 比如使用下面这个命令就可

java中用jsoup抓取网页源码,并批量下载图片

一.导入jsoup的核心jar包jsoup-xxx.jar jar包下载地址:jsoup-1.8.2.jar 中文API地址:http://www.open-open.com/jsoup/parsing-a-document.htm 二.java中用jsoup抓取网页源码,并批量下载图片 package com.dgh.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; i

代码块:在Java中用{}括起来的代码

代码块:在Java中用{}括起来的代码 (1)在Java中用{}括起来的代码. (2)代码块分类:(根据其位置和声明的不同) A:局部代码块 在方法定义中,用于限定变量的生命周期,及早释放,提高内存利用率. B:构造代码块 在类中方法外出现(即在类中的成员位置),可以把多个构造方法方法中相同的代码存放到一起,用于对对象进行初始化,每次调用构造方法都执行,并且在构造方法前执行. C:静态代码块 在类中方法外出现(即在类中的成员位置),并加上static修饰,用于对类进行初始化,静态在类加载的时候就

Oracle数据库以date类型保存日期时,Java中用哪个类对应数据库的date类型?

1. 使用JDBC操作Oracle数据库时,使用java.sql.Date类型对应数据库的date类型,此时只能保存和读取日期部分, 时间(时分秒)部分不能读取和保存:  查询结果集可以直接获取Date类型的数据:java.sql.Date date=resultSet.getDate("dateTime"): java.sql.Date类型的数据也可以直接保存到数据库或者与数据库中date类型的数据直接比较大小: 字符串的日期,则用SQL语句的转换函数 to_date('2017-4

JAVA中用堆和栈的概念来理解equals() &quot;==&quot;和hashcode()

在学习java基本数据类型和复杂数据类型的时候,特别是equals()"=="和hashcode()部分时,不是很懂,也停留了很长时间,最后终于有点眉目了. 要理解equals()"=="和hashcode(),最好先了解Java内存中堆和栈的知识: 下面一段是参考自http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html 大家也可点进去查看更详细的解释. Java 中的堆和栈  Java把内存划分成两种

java中用正則表達式推断中文字符串中是否含有英文或者数字

public static boolean includingNUM(String str)throws  Exception{ Pattern p  = Pattern.compile("[\u4e00-\u9fa5]*[\\d|\\w]+[\u4e00-\u9fa5]*"); //或者  Pattern p  = Pattern.compile("[\u4e00-\u9fa5]*[0-9|a-z|A-Z]+[\u4e00-\u9fa5]*"); Matcher

java中用date和数据库中的date

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date qsrq = sdf.parse("2016-03-05"); java中的属性是Date型的 数据库中是这个样子"2016-03-05 00:00:00" 拿着java属性就可以到数据库中查询日期字段了 ----这样就可以连接到数据库中,原来是这样匹配的