java >>> 和 >>>=的区别
java >> 和 >>> 以及 >>>= 的区别
可能大家都知道java中>> 和 >>> 的区别,那这里我也啰嗦一下,>> 和 >>> 都是右移操作,只不过>>>是无符号右移,也就是右移之后高位补零。对于正数来说,两者没有什么区别,但是对于负数来说,>> 右移之后还是负数,而>>>右移之后就变成了正数,大家可以参看一下例子:
public class ShiftTest {
public static void main(String[] args) {
int n = 15;
System.out.println(java.lang.Integer.toBinaryString(n));
System.out.println(n >> 2);
System.out.println(n >>> 2); int m = -15;
System.out.println(java.lang.Integer.toBinaryString(m));
System.out.println(m >> 2);
System.out.println(m >>> 2);
}
} 输出结果
1111
3
3
11111111111111111111111111110001
-4
1073741820
此例以及结果大家一定也能看明白,唯一要注意的是计算机是以补码的形式存储的,大家可以去查看相关资料。那接下来就说一下 >>> 和 >>>= 的区别(因为有一次同学翻看ThreadLocal源码的时候,发现了cleanSomeSlots方法里有>>>=这个操作符,以前没有见过这个操作,只知道>>>是无符号右移,于是我们就讨论起来),我当时写了一段测试代码,如下所示:
public class ShiftTest {
public static void main(String[] args) {
int n = -4;
System.out.println(n >>>= 1);
System.out.println(n >>> 1); int j = 4;
System.out.println(j >>>= 1);
System.out.println(j >>> 1);
}
} 输出结果
2147483646
1073741823
2
1
从此例中,大家可能比较疑惑了,第9行为什么会输出1,应该是2啊,我也比较纳闷,这个时候同学一点拨,就恍然大悟,其实j在第8行被重新赋值了成了2,而第9行再进行右移当然输出1。从这个例子中我们就知道了其实>>>=就是类似于+=这种操作,右移之后做了一个赋值。
总结
其实移位操作在我们平时用的并不多,但是在阅读JDK源码的时候经常会出现,比如concurrent包里的ThreadPoolExcutor、ConcurrentHashMap等。所以掌握移位操作以及原码、反码、补码、还是很有必要的。
java >>> 和 >>>=的区别的更多相关文章
- C++与Java的语法区别
C++与Java的语法区别 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别. main 函数C++//自由浮动的函数int main( int argc, char* argv[]) ...
- C++和java多态的区别
C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报 转载自:http://www.cnblogs.com/plmnko/archive ...
- java的版本区别、下载、配置
参考:http://blog.csdn.net/liujun13579/article/details/7684604 java的版本区别 常用的 java 程序分为 Java SE.Java EE ...
- 第一章.java&golang的区别之:闭包
对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...
- java的this static public protected private abstract interface 在python的对应,java python一些区别
1.因为工作的原因,最近使用了三个多月的java作为主力语言.很早之前在菜鸟教程也看过java文档两遍,但实践少,处于能看懂写出来不流畅的状态(对于java必须要略懂,不能能看到就头疼跳过,因为现在百 ...
- 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean
7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...
- Android Library和Android APP、Java Library的区别
Android Library和Android APP.Java Library的区别 Android Library在目录结构上与Android App相同,它能包含构建APP所需的一切(如源代码. ...
- JS与JAVA数据类型的区别
JavaScript与Java数据类型的区别 阅读目录 Number String Boolean Null Undefined Object 今天开始正式认真学习js,虽然在平常j2ee开发中也 ...
- JavaScript与Java数据类型的区别
今天开始正式认真学习js,虽然在平常j2ee开发中也经常用到JS但并不精通,这次随笔记下js与Java数据类型的不同之处 Number 与java不同,js作为弱类型语言即使在浮点数与整数上也未作明确 ...
- java StirngStringbufferStringbuild的区别
java StirngStringbufferStringbuild的区别 String 1,Stirng是对象不是基本数据类型 2,String是final类,不能被继承.是不可变对象,一旦创建, ...
随机推荐
- [How to] 使用Xib来创建view
1.简介 代码库 正如之前博客介绍的,xib可定义页面的某个部分,特别当此部分区域的view集中并且还有一些相互关联性(如隐藏等)是i特别适合使用xib来进行封装. 本文为[How to]使用自定义c ...
- iframe子页面获取父页面元素和window对象
项目中发现要在iframe的弹框中获取父页面中的元素,我们可以按照如下代码操作:$(window.parent.document).find('selector').attr('XXX') 如果我们需 ...
- CF914F Substrings in a String
Description 给你一个字符串ss,共有qq次操作,每个都是下面两种形式的一种. 11 ii cc 这个操作表示将字符串ss的第ii项变为字符cc 22 ll rr yy 这个操作表示输出字符 ...
- 关于移动端audio自动播放问题
本人小白全栈一枚,给公司写了一个监控中心,要求严重报警的时候需要触发音频播放,于是就有了以下的折腾. 刚开始一切都很顺利,自然而然的写了以下代码. <audio id="myaudio ...
- python mock的简单使用
参考文章: http://blog.csdn.net/wenph2008/article/details/46862771 内容待填充...
- Delphi获取毫秒级时间戳
function GetJavaTime( d: TDateTime ): Int64; var dJavaStart: TDateTime; begin //java里的时间是从1970年1月1日0 ...
- Java学习笔记(八)——java多线程
[前面的话] 实际项目在用spring框架结合dubbo框架做一个系统,虽然也负责了一块内容,但是自己的能力还是不足,所以还需要好好学习一下基础知识,然后做一些笔记.希望做完了这个项目可以写一些dub ...
- Introducing the Filter Types
The ActionFilterAttribute class implements both the IActionFilter and IResultFilter interfaces. This ...
- Linux上安装MongoDB
使用本教程使用.rpm 软件包在红帽企业Linux或CentOS Linux版本6和7上安装MongoDB Community Edition . 平台支持 本安装指南仅支持64位系统.详细信息请参见 ...
- .NET ORM SqlQuery
查询 1.SqlQuery 用于执行原生SQL和存储过程 //转成list List<Student> list1 = db.SqlQuery<Student>("s ...