阿里云有了域名 网站建设,网页4399小游戏,传奇手游网页游戏平台,网页设计结束语在阅读源码的过程中#xff0c;经常会看到这些符号 #xff0c;#xff0c;#xff0c;这些符号在Java中叫移位运算符#xff0c;在写代码的过程中#xff0c;虽然我们基本上不会去写这些符号#xff0c;但需要明白这些符号的运算原理…在阅读源码的过程中经常会看到这些符号 这些符号在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转换成二进制在计算机中的表示如下value 1左移1位左移1位后换算成十进制的值为1466367340刚好是733183670的两倍 有些人在乘2操作时喜欢用左移运算符来替代。value 8左移8位看一下左移8位后变成了十进制的值为-1283541504移动8位后由于首位变成了1也就是说成了负数在使用中要考虑变成负数的情况。根据这个规则左移32位后右边补上32个0值是不是就变成了十进制的0了答案是NO当int类型进行左移操作时左移位数大于等于32位操作时会先求余(%)后再进行左移操作。也就是说左移32位相当于不进行移位操作左移40位相当于左移8位(40%328)。当long类型进行左移操作时long类型在二进制中的体现是64位的因此求余操作的基数也变成了64也就是说左移64位相当于没有移位左移72位相当于左移8位(72%648)写一段代码来测试一下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%320相当于左移0位(不移位)System.out.println(intValue左移40位 (intValue 40));//求余为40%328相当于左移8位System.out.println(intValue左移64位 (intValue 64));//求余为64%320相当于左移0位(不移位)long longValue 733183670L;System.out.println(longValue (longValue));//打印longValueSystem.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%640相当于左移0位(不移位)System.out.println(longValue左移72位 (longValue 72));//求余为72%648相当于左移8位System.out.println(longValue左移128位 (longValue 128));//求余为128%640相当于左移0位(不移位)看一下结果由于doublefloat在二进制中的表现比较特殊因此不能来进行移位操作报错编译不过如下图注意其它几种整形byteshort移位前会先转换为int类型(32位)再进行移位这里就不写代码测试了大家有兴趣可自行测试。综上所述左移 其实很简单也就是说丢弃左边指定位数右边补0。2、右移运算符还是这个数733183670value 1右移1位右移1位后换算成十进制的值为366591835刚好是733183670的1半 有些人在除2操作时喜欢用右移运算符来替代value 8右移8位看一下写一段代码测试一下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%320相当于右移0位(不移位)System.out.println(intValue右移40位 (intValue 40));//求余为40%328相当于右移8位System.out.println(intValue右移64位 (intValue 64));//求余为64%320相当于右移0位(不移位)long longValue 733183670L;System.out.println(longValue (longValue));//打印longValueSystem.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%640相当于右移0位(不移位)System.out.println(longValue右移72位 (longValue 72));//求余为72%648相当于右移8位System.out.println(longValue右移128位 (longValue 128));//求余为128%640相当于右移0位(不移位)结果和左移一样int类型移位大于等于32位时long类型大于等于64位时会先做求余处理再位移处理byteshort移位前会先转换为int类型(32位)再进行移位。以上是正数的位移我们再来看看负数的右移运算如图负数intValue-733183670的二进制表现如下图右移8位intValue 8综上所述右移运算符的运算规则也很简单丢弃右边指定位数左边补上符号位。3、无符号右移运算符无符号右移运算符和右移运算符是一样的只不过右移时左边是补上符号位而无符号右移运算符是补上0也就是说对于正数移位来说等同于负数通过此移位运算符能移位成正数。以-7331836708为例来画一下图无符号右移运算符的运算规则也很简单丢弃右边指定位数左边补上0。摘自https://zhuanlan.zhihu.com/p/30108890