前言:
阅读java源码会经常碰到左移与右移运算。那么左移与右移都是怎么运算呢?查询资料学习了下,这里做个总结。
一.左移 (<<)
直接举个例
图中测试结果我们可以看到
1<<2=4;
1<<3=8;
是不是发现规律了?没错规律就是左移几位就是乘以2的几次方。
一个数左移几位的结果就是,这个数乘以2的几次方的值。
补充说明:
左移无论是正数还是负数计算规则都是一样的,就像上面所说,用官方的话来说就叫:高位向左移动,低位补零。
二.右移(>>)
左移的结果是一个数乘以2的n次方,那右移是一个数除以2的n次方吗?其实不是,这么记是不对的,应该将这个数转化为2进制数,然后将这个数向右移动。这么计算才是准确的(左移右移原理都一样,只是向右移动特殊),符号位不变。
比如2进制的数13,: 0000 0000 0000 0000 0000 0000 0000 1101 对13进行右移2位 :13>>2 0000 0000 0000 0000 0000 0000 0000 0011 所以 13>>2=3;
发现规律了吧,就是将低位右移,高位补零,符号位不变。这就是右移运算的规律。
补充说明:
无论是左移还是右移都不会改变原始数据的符号。但是右移移多了就是0了。右移不可以简单的记忆成除以2的几次方,这么记是不对的。
三.无符号右移(>>>)
已经知道,左移与右移都不会改变数据的正负号,但是无符号右移(>>>)则会。
举个例子看下右移与无符号右移的区别: 13>>>2=3 -13>>>2=1073741820
总结:
正数的无符号右移:与右移规则一致。
负数的无符号右移:这个就有点麻烦了,需要先将负数取反,得到反码,然后反码加1得到补码,补码再进行右移,这样得到的结果就是无符号右移的结果了。