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是一样的结果。

第一次写博客,写的很粗糙,欢迎大家指正。

原创粉丝点击