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


前言:
阅读java源码会经常碰到左移与右移运算。那么左移与右移都是怎么运算呢?查询资料学习了下,这里做个总结。

一.左移 (<<)

直接举个例子:
在这里插入图片描述
图中测试结果我们可以看到
1<<2=4;
1<<3=8;
是不是发现规律了?没错规律就是左移几位就是乘以2的几次方
一个数左移几位的结果就是,这个数乘以2的几次方的值。
补充说明:
左移无论是正数还是负数计算规则都是一样的,就像上面所说,用官方的话来说就叫:高位向左移动,低位补零。

二.右移(>>)

左移的结果是一个数乘以2的n次方,那右移是一个数除以2的n次方吗?其实不是,这么记是不对的,应该将这个数转化为2进制数,然后将这个数向右移动。这么计算才是准确的(左移右移原理都一样,只是向右移动特殊),符号位不变。

比如2进制的数13,0000 0000 0000 0000 0000 0000 0000 110113进行右移2位 :13>>2
0000 0000 0000 0000 0000 0000 0000 0011
所以 13>>2=3;

发现规律了吧,就是将低位右移,高位补零,符号位不变。这就是右移运算的规律。
补充说明:
无论是左移还是右移都不会改变原始数据的符号。但是右移移多了就是0了。右移不可以简单的记忆成除以2的几次方,这么记是不对的。

三.无符号右移(>>>)

已经知道,左移与右移都不会改变数据的正负号,但是无符号右移(>>>)则会。

举个例子看下右移与无符号右移的区别:
13>>>2=3
-13>>>2=1073741820

总结:
正数的无符号右移:与右移规则一致。
负数的无符号右移:这个就有点麻烦了,需要先将负数取反,得到反码,然后反码加1得到补码,补码再进行右移,这样得到的结果就是无符号右移的结果了。

猜你喜欢

转载自blog.csdn.net/m0_46897923/article/details/115387115