为什么在 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
为什么在 Java 中用 (low+high)>>>1 代替 (low+high)/2 或 (low+high)>>1 来计算平均值呢?好在哪里?
- hadoop-java:计算平均值分布式程序编写
- <a href="onclick="javascript:goSearch(this)" class="click" name="Java">Java</a>为什么a标签的父节点获取不到
- Java程序设计(十一)----计算的窗口求和求平均值
- Java_whilefor-->计算1!+2!+3!+..+10!
- 请问一下在java中的List<int> list=new List<int>();这条语句的两个int处会报错,请问为什么?
- <JAVA>为什么一个java文件只能有一个public类
- Java_whilefor-->计算1到100以内的奇数和偶数的和
- 为什么java里面经常作List判断的时候,既要判断list不为null,又要判断size>0呢?
- 解决kylin报错:Failed to create dictionary on <db>.<table>, Caused by: java.lang.IllegalArgumentException: Too high cardinality is not suitable for dictionary
- JAVA为什么有时候除法计算结果本来应该是小数。但是得到整数int类型
- JAVA比C++好在哪里?
- 为什么Java中的HashMap<K, V>的get函数是get(Object key),而不是get(K key)?
- java计算md5值-为什么要把结果转为16进制的字符串?
- JNI中用 javah.exe 产生头JNI-Style文件出现错误:无法访问 <class> 未找到 <class> 的类文件
- 编写Java程序,计算100~999之间的全部“水仙花数”的平均值。
- java梳理-浮点类型计算为什么不准确
- 计算3个整数的平均值---java
- F#比java这种垃圾语言好在哪里
- Student类,包括学生姓名、性别、年龄、Java成绩。要求创建五个该类对象,输出每个学生信息,计算并输出这五个学生Java成绩的平均值, 以及计算并输出他们Ja
- 根据类Student的定义,创建五个该类的对象,输出每个学生的信息, 计算并输出这五个学生Java语言成绩的平均值,以及计算并输出他们Java语言成绩的最大值和最小值。