Java中的移位运算符
1、左移运算符:<<
先随便定义一个int类型的数int,十进制的value = https://www.it610.com/article/733183670,转换成二进制在计算机中的表示如下:
文章图片
value << 1,左移1位
文章图片
左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍, 有些人在乘2操作时喜欢用左移运算符来替代。
【Java中的移位运算符】value << 8,左移8位看一下:
文章图片
左移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 = https://www.it610.com/article/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 = https://www.it610.com/article/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位(不移位)
看一下结果:
文章图片
由于double,float在二进制中的表现比较特殊,因此不能来进行移位操作,报错,编译不过,如下图:
文章图片
注意:其它几种整形byte,short移位前会先转换为int类型(32位)再进行移位,这里就不写代码测试了,大家有兴趣可自行测试。
综上所述:左移 << 其实很简单,也就是说丢弃左边指定位数,右边补0。
2、右移运算符:>>
还是这个数:733183670
文章图片
value >> 1,右移1位
文章图片
右移1位后换算成十进制的值为:366591835,刚好是733183670的1半, 有些人在除2操作时喜欢用右移运算符来替代
value >> 8,右移8位看一下
文章图片
写一段代码测试一下
java
int intValue = https://www.it610.com/article/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 = https://www.it610.com/article/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位(不移位)
结果:
文章图片
和左移一样,int类型移位大于等于32位时,long类型大于等于64位时,会先做求余处理再位移处理,byte,short移位前会先转换为int类型(32位)再进行移位。以上是正数的位移,我们再来看看负数的右移运算,如图,负数intValue:-733183670的二进制表现如下图:
文章图片
右移8位,intValue >> 8
文章图片
综上所述:右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上符号位。
3、无符号右移运算符:>>>
无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,负数通过此移位运算符能移位成正数。以-733183670>>>8为例来画一下图
文章图片
无符号右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上0。
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 事件代理
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- Java|Java OpenCV图像处理之SIFT角点检测详解