Java中的移位运算符

2023-02-19 0 968

国庆节给他们放了个小长年二十几天,回去竭尽全力预览时评

上一则该文他们说了Java里的十进制,晓得了计算机系统是以0和1来处置统计数据的,在写作源代码的操作过程中,时常会看见那些记号<< ,>>,>>>,那些记号在Java中叫位移操作符,在写标识符的操作过程中,尽管他们大体上不能去写那些记号,但须要晓得那些记号的演算基本原理,比如说HashMap下列标识符:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//右移 static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);//无记号右移}

上段标识符中就包涵右移操作符<<,无记号右移操作符>>>。这篇该文详细说一下这三个记号:

1、右移操作符:<<

先随便定义一个int类型的数int,十进制的value = 733183670,转换成二进制在计算机系统中的表示如下:

Java中的移位运算符

value << 1,右移1位

Java中的移位运算符

右移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍, 有些人在乘2操作时喜欢用右移操作符来替代。

value << 8,右移8位看一下:

Java中的移位运算符

右移8位后变成了十进制的值为:-1283541504,移动8位后,由于首位变成了1,也就是说成了负数,在使用中要考虑变成负数的情况。

根据这个规则,右移32位后,右边补上32个0值是不是就变成了十进制的0了?答案是NO,当int类型进行右移操作时,左位移数大于等于32位操作时,会先求余(%)后再进行右移操作。也就是说右移32位相当于不进行位移操作,右移40位相当于右移8位(40%32=8)。当long类型进行右移操作时,long类型在十进制中的体现是64位的,因此求余操作的基数也变成了64,也就是说右移64位相当于没有位移,右移72位相当于右移8位(72%64=8),写一段标识符来测试一下

int intValue = 733183670;//随意写一个数 System.out.println(“intValue:” + (intValue));//打印intValue System.out.println(“intValue右移1位:” + (intValue << 1));//右移1位 System.out.println(“intValue右移8位:” + (intValue << 8));//右移8位//当int类型左位移数大于等于32位操作时,会先求余后再进行位移操作 System.out.println(“intValue右移32位:” + (intValue << 32));//求余为32%32=0,相当于右移0位(不位移)System.out.println(“intValue右移40位:” + (intValue << 40));//求余为40%32=8,相当于右移8位 System.out.println(“intValue右移64位:” + (intValue << 64));//求余为64%32=0,相当于右移0位(不位移) long longValue = 733183670L; System.out.println(“longValue:” + (longValue));//打印longValue System.out.println(“longValue右移1位:” + (longValue << 1));//右移1位 System.out.println(“longValue右移8位:” + (longValue << 8));//右移8位 //当long类型左位移数大于等于64位操作时,会先求余后再进行位移操作System.out.println(“longValue右移64位:” + (longValue << 64));//求余为64%64=0,相当于右移0位(不位移) System.out.println(“longValue右移72位:” + (longValue << 72));//求余为72%64=8,相当于右移8位 System.out.println(“longValue右移128位:” + (longValue << 128));//求余为128%64=0相当于右移0位不位移

看一下结果:

Java中的移位运算符

由于double,float在十进制中的表现比较特殊,因此不能来进行位移操作,报错,编译不过,如下图:

Java中的移位运算符

注意:其它几种整形byte,short位移前会先转换为int类型(32位)再进行位移,这里就不写标识符测试了,大家有兴趣可自行测试。

综上所述:右移 << 其实很简单,也就是说丢弃左边指定位数,右边补0。

2、右移操作符:>>

还是这个数:733183670

Java中的移位运算符

value >> 1,右移1位

Java中的移位运算符

右移1位后换算成十进制的值为:366591835,刚好是733183670的1半, 有些人在除2操作时喜欢用右移操作符来替代

value >> 8,右移8位看一下

Java中的移位运算符

写一段标识符测试一下

int intValue = 733183670;//随意写一个数 System.out.println(“intValue:” + (intValue));//打印intValueSystem.out.println(“intValue右移1位:” + (intValue >> 1));//右移1位 System.out.println(“intValue右移8位:” + (intValue >> 8));//右移8位 //当int类型右位移数大于等于32位操作时,会先求余后再进行位移操作 System.out.println(“intValue右移32位:” + (intValue >> 32));//求余为32%32=0,相当于右移0位(不位移) System.out.println(“intValue右移40位:” + (intValue >> 40));//求余为40%32=8,相当于右移8位System.out.println(“intValue右移64位:” + (intValue >> 64));//求余为64%32=0,相当于右移0位(不位移) long longValue = 733183670L; System.out.println(“longValue:” + (longValue));//打印longValue System.out.println(“longValue右移1位:” + (longValue >> 1));//右移1位 System.out.println(“longValue右移8位:” + (longValue >> 8));//右移8位 //当long类型右位移数大于等于64位操作时,会先求余后再进行位移操作System.out.println(“longValue右移64位:” + (longValue >> 64));//求余为64%64=0,相当于右移0位(不位移) System.out.println(“longValue右移72位:” + (longValue >> 72));//求余为72%64=8,相当于右移8位 System.out.println(“longValue右移128位:” + (longValue >> 128));//求余为128%64=0相当于右移0位不位移

结果:

Java中的移位运算符

和右移一样,int类型位移大于等于32位时,long类型大于等于64位时,会先做求余处置再位移处理,byte,short位移前会先转换为int类型(32位)再进行位移。以上是正数的位移,他们再来看看负数的右移演算,如图,负数intValue:-733183670的十进制表现如下图:

Java中的移位运算符

右移8位,intValue >> 8

Java中的移位运算符

综上所述:右移操作符>>的演算规则也很简单,丢弃右边指定位数,左边补上记号位。

3、无记号右移操作符:>>>

无记号右移操作符>>>和右移操作符>>是一样的,只不过右移时左边是补上符号位,而无记号右移操作符是补上0,也就是说,对于正数位移来说等同于:>>,负数通过此位移操作符能位移成正数。以-733183670>>>8为例来画一下图

Java中的移位运算符

无记号右移操作符>>的演算规则也很简单,丢弃右边指定位数,左边补上0。

注:本时评示例标识符已上传至公众号:saysayJava,须要可自行关注下载。

如果喜欢本时评的系列该文,请为我点赞或顺手分享,您的支持是我竭尽全力下去的动力,您也可以在评论区留言想了解的内容,有机会本时评会做讲解,最后别忘了关注一下我。

上一则:Java中的十进制 – 知乎时评

下一则:写作中

本时评所有该文请点击:时评目录索引

转载无限欢迎,但请注明「作者」和「原文地址」。转载请在文中保留此段,感谢您对作者版权的尊重。如需商业转载或刊登,请联系作者获得授权。

为啥你学了1年Java,还是上手不了业务?
已失效

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务