java中左移、右移和无符号右移

作者 : 开心源码 本文共2206个字,预计阅读时间需要6分钟 发布时间: 2022-05-12 共179人阅读

我们在看某些jdk的源码时经常能看到”>>”(右移)、”<<“(左移)、”>>>”(无符号右移),比方下面这段

1550050893(1).jpg

它们经常被用来扩充动态集合的大小,下面我们看段代码看下”>>”、”<<“、”>>>”都做了什么操作。

我们写下面这段代码,先看左移

public class Main2 {    public static void main(String[] args) {        Integer aValue =10;        show(aValue);        Integer leftMoveValue1 =aValue <<1; //左移1位        show(leftMoveValue1);        Integer leftMoveValue2 =aValue <<2; //左移2位        show(leftMoveValue2);        Integer leftMoveValue3 =aValue <<2;//左移3位        show(leftMoveValue3);    }    /**     * 打印数字对应的二进制字符串     * @param number     */    public static void show(Integer number)    {        System.out.println(Integer.toBinaryString(number));    }}

结果是:

101010201010040101000801010000

原来的值为10

左移一位值为10*2的1次方   20左移两位值为10*2的2次方   40左移两位值为10*2的3次方   80

表现在二进制上,是将二进制的低位补0,既为左移

接下来我们将左移变成右移,代码如下:

public class Main2 {    public static void main(String[] args) {        Integer aValue =10;        show(aValue);        Integer leftMoveValue1 =aValue >>1; //右边移1位        show(leftMoveValue1);        Integer leftMoveValue2 =aValue >>2; //右移2位        show(leftMoveValue2);        Integer leftMoveValue3 =aValue >>2;//右移3位        show(leftMoveValue3);    }    /**     * 打印数字对应的二进制字符串     * @param number     */    public static void show(Integer number)    {        System.out.println(Integer.toBinaryString(number));    }}

结果是:

101010510121011

原来的值为10

右移一位值为10/2的1次方   5右移两位值为10/2的2次方   2右移两位值为10/2的3次方   1

表现在二进制上,是将二进制的低位直接去掉,既为右移,右移n位相当于10/2的n次方

接下来我们将左移变成无符号右移,代码如下:

public class Main2 {    public static void main(String[] args) {        Integer aValue =10;        show(aValue);        Integer leftMoveValue1 =aValue >>>1; //无符号右边移1位        show(leftMoveValue1);        Integer leftMoveValue2 =aValue >>>2; //无符号右移2位        show(leftMoveValue2);        Integer leftMoveValue3 =aValue >>>2;//无符号右移3位        show(leftMoveValue3);    }    /**     * 打印数字对应的二进制字符串     * @param number     */    public static void show(Integer number)    {        System.out.println(Integer.toBinaryString(number));    }}

结果是:

101010510121011

原来的值为10

无符号右移一位值为10/2的1次方   5无符号右移两位值为10/2的2次方   2无符号右移两位值为10/2的3次方   1

同为整数10时,我们看不到右移和无符号右移的区别

于是我们把右移中的值10变更为-10,先看看右移结果

-10>>1
-10>>2
-10>>3

-1011111111111111111111111111110110-511111111111111111111111111111011-311111111111111111111111111111101-211111111111111111111111111111110

我们看到,负数右移依然是将二进制的最低位直接去掉,但是保证了位数不变,在最高位补了1,负数的右移反而变大了

我们继续看看无符号右移

-10>>>1
-10>>>2
-10>>>3

-101111111111111111111111111111011021474836431111111111111111111111111111011107374182111111111111111111111111111110153687091011111111111111111111111111110

负数进行无符号右移时变成了很大的正数。相当于是将低位去掉后,在高位补了0,
我后来又试了一下 -1左移一位时,刚好为2147483648,正好为Interge.maxValue的值
先这样吧…

后记:

以后再也不怕在源码中看见左移右移了,其实自己都能算出来的

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » java中左移、右移和无符号右移

发表回复