java运算符,>>,>>>,<<
来源:互联网 发布:知乎 安卓下载 编辑:程序博客网 时间:2024/06/12 09:51
>>:有符号右移
>>>:无符号右移
<<:左移
>>:有符号右移,就是把int值在内存中的补码,整体向右移动,空出来的位补符号位。
>>>:无符号右移,就是把int值在内存中的补码,整体向右移动,空出来的位补0。
int类型的数据,在内存中是按照补码的形式存放的。右移的时候,先把这32位的补码,整体先移动相应的位数。如果是>>,则因为移动空出来的位,就补上符号位(即32位补码中的最高位)。如果是>>>,则因为移动空出来的位,直接补上0。这样还会得到一个32位的二进制串,这个32位的二进制串,再按照补码的形式去解析,最后解析的结果是什么,就返回相应的int数值。下面举一个例子。
int x = 5;
由于5的补码是0000 0000 0000 0000 0000 0000 0000 0101
x>>2之后是多少呢?先右移两位,得到_ _00 0000 0000 0000 0000 0000 0000 0001,最后最高位空出来的两位补上 符号位0 ,得到 0000 0000 0000 0000 0000 0000 0000 0001
按照补码来解析,就是1;
同理x>>>2,空出来的位,补0。和上面的结果是一样的,所以正数有符号右移和无符号右移相同的位数,得到的结果是一样的.
因为正数的符号位是0,空位补符号位,就是空位补0.而>>> 本身就规定空位补0. 所以得到的结果当然一样啦。
为方便计算,x>>>k x>>k 如果x为正数的话,最后得到的结果就是,x/2^k
下面讲负数的无符号右移和有符号右移:
int x = -1;
x>>2是多少呢?自己可以先在草稿纸上面算一下,写下-1的补码,然后整体右移两位,空出来的两位补符号位,因为是负数,符号位肯定是1啦,然后对得到的32位二进制数,按照补码解析,看看结果是多少.
-1的补码是: 1111 1111 1111 1111 1111 1111 1111 1111,整体右移两位,_ _ 11 1111 1111 1111 1111 1111 1111 1111 ,空出来的两位再补上符号位1,最后还是1111 1111 1111 1111
1111 1111 1111 1111 按照补码解析,结果还是-1;
那么x>>>2 是多少呢? 还是整体右移两位,只不过空出来的两位补0而已,最后得到 0011 1111 1111 1111 1111 1111 1111 1111 按照补码进行解析的话,是2^30-1, 即1073741823
同理,左移也和这个类似,只不过空出来的是最低几位,这时候补上0,再按照补码解析,不再讲解了。
有意思的是,无论是>>,>>>还是<<,当移位的位数是32位的时候,就会得到原来的值。
int x = -5;
System.out.println(x >> 32);
System.out.println(x >>> 32);
System.out.println(x << 32);
输出的结果都是-5,这是因为如果设计成我们想象的那样,<<32位及以上的话,那么最后的结果肯定是0,这样就无意义了。所以java把x>>k设计成x>>(k%32),x>>33和x>>1是一样的结果。第一次写博客,写的很粗糙,欢迎大家指正。
- Java运算赋值运算符
- Java| Java 运算符
- Java位运算符
- java运算符
- java中的“%”运算符
- Java 位运算符
- Java 位运算符
- Java 位运算符
- Java 位运算符
- java 运算符优先级
- Java 位运算符
- java 运算符
- JAVA入门:运算符
- JAVA 运算符 >> >>> <<
- JAVA移位运算符
- Java 位运算符
- JAVA移位运算符
- java 运算符
- PHP简易商城(二)PHP运行sql文件安装数据库
- yield在大循环中需要注意的一个情况
- 关于两个数交换
- 【异步请求相关知识点】flush()缓冲区强制写出
- angular4子路由&辅助路由
- java运算符,>>,>>>,<<
- windows 10 安装composer 出错
- 提高Eclipse启动速度的办法
- 【Docker构建】- Nginx创建带Nginx服务的Centos Docker镜像
- 把linux用户添加到其他组
- 2017上半年总结
- 【C语言】if分支语句
- java 新手入门课程03
- 基于tcp的C/S模型